链栈的基本操作(C语言)
栈的链式储存结构称为链栈。链栈的节点类型与链式线性表的节点类型
定义相同,不同的是它是仅在表头进行操作的单链表。链栈通常用不带头节
点的单链表来实现,栈顶指针就是链表的头指针 ,如图所示:
代码如下:
#include <stdio.h>
#include <stdlib.h> #define OK 1
#define ERROR 0
typedef int SElemType;
//栈的链式储存结构
typedef struct SNode {
SElemType data; //数据域
struct SNode *next; //指针域 }SNODE, *PSNODE;
//栈顶节点
typedef struct
{
PSNODE top; //栈顶指针
int count; //栈的长度 }LinkStack; //初始化栈顶节点
int Init_LS(LinkStack *s) {
s->top = (PSNODE)malloc(sizeof(SNODE));
if (!s->top)
return ERROR; s->top = NULL;
s->count = ;
return OK;
}
//判断栈是否为空
int Is_Empty(LinkStack *s) {
if (s->top == NULL)
{
printf("栈为空\n");
return OK;
} else {
printf("栈不为空\n");
return ERROR;
}
}
//遍历栈
int Traverse_LS(LinkStack *s) {
int i;
if (Is_Empty(s) == OK) return ERROR;
PSNODE p = s->top;
for(i=s->count;i>;i--)
{ printf("%d ", p->data);
p = p->next;
}
printf("\n");
return OK;
}
//链栈元素入栈
int Push_LS(LinkStack *s, SElemType e) { PSNODE p = (PSNODE)malloc(sizeof(SNODE));
if (!p) return ERROR;
p->data = e;
p->next = s->top; //新结点指向栈顶指针指向的地址
s->top = p; //更新栈顶指针
s->count++; // 节点增加1 return OK; }
// 获取栈顶元素
int GetTop(LinkStack *s, SElemType *e) {
if (Is_Empty(s) == OK) return ERROR;
*e = s->top->data;
return OK;
}
//链栈元素出栈
int Pop_LS(LinkStack *s, SElemType *e) {
if (Is_Empty(s) == OK) return ERROR; PSNODE temp = s->top;
*e = temp->data;
s->top = temp->next;
s->count--;
free(temp);
return OK;
}
//销毁栈
int Destroy_LS(LinkStack *s) {
PSNODE p,q=NULL;
if(Is_Empty(s)==OK) return ERROR;
p = s->top;
for (int i = s->count; i > ; i--)
{
q = p->next;
free(p);
p = q;
}
s->count = ;
return OK;
} int main() {
LinkStack s,*ps;
SElemType a, *e;
e = (SElemType*)malloc(sizeof(SElemType));
ps = &s;
Init_LS(ps);
int n;
Is_Empty(ps);
printf("请输入入栈元素的个数:");
scanf("%d", &n);
for(int i=;i<n;i++)
{
scanf("%d", &a);
Push_LS(ps, a);
}
Traverse_LS(ps);
Pop_LS(ps, e);
printf("弹出的元素为%d\n", *e);
Traverse_LS(ps);
GetTop(ps, e);
printf("栈顶元素为%d\n", *e);
if(Destroy_LS(ps)==OK) printf("栈销毁成功!"); return ;
}
我写的这个链栈的代码 稍微修改了一点 --把栈顶指针与count 组成一个结构体
count用来储存链栈的长度。如果链栈的长度很长而且经常需要返回长度 一个一个
算的话显得特别费时间;而使用count要方便的多 。
如果我们要把两个链栈合并,必然需要其中一个的栈底地址
而且如果这个链栈很大,我们要从栈顶开始寻找栈底地址 很麻烦吧
但是我们在LinkStack 中增加一个 PSNODE bottom指针,在入栈函数中
根据count来给bottom赋值。这样栈底地址就有了。
所以,数据结构的一些细节上的东西不是一成不变的,而是可以根据具体
的问题修改。
链栈的基本操作(C语言)的更多相关文章
- C语言实现链栈以及基本操作
链栈,即用链表实现栈存储结构.链栈的实现思路同顺序栈类似,顺序栈是将数顺序表(数组)的一端作为栈底,另一端为栈顶:链栈也如此,通常我们将链表的头部作为栈顶,尾部作为栈底,如下下图所示: 将链表头部作为 ...
- C++实现链栈的基本操作
之前对顺序栈写了基本操作,认为有必要也动手练练栈的链表实现. 对于链栈,一般不会出现栈满的情况. 链栈头文件定义例如以下: #ifndef CSTOCK_H_ #define CSTOCK_H_ ty ...
- 顺序栈的基本操作(C语言)
由于现在只学了C语言所以就写这个C语言版的栈的基本操作 这里说一下 :网上和书上都有这种写法 int InitStack(SqStack &p) &p是取地址 但是这种用法好像C并不 ...
- 数据结构——Java实现链栈
一.分析 栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表. 链栈是指采用链式存储结构实现的 ...
- C语言简单实现链栈基本几个功能(适合新手看,大神可指正)
接着上一次的顺序栈,今天我记一下链栈,因为我也是刚学不久,有些地方也稍稍理解不了,所以,一起共勉.我会用我自己结合教材上画的图,争取跟代码一起结合,用文字和图最大化的解释代码,这样的话 ...
- C语言简单实现链栈基本几个功能
接着上一次的顺序栈,今天我记一下链栈,因为我也是刚学不久,有些地方也稍稍理解不了,所以,一起共勉.我会用我自己结合教材上画的图,争取跟代码一起结合,用文字和图最大化的解释代码,这样的话 ...
- 数据结构 - 链栈的实行(C语言)
数据结构-链栈的实现 1 链栈的定义 现在来看看栈的链式存储结构,简称为链栈. 想想看栈只是栈顶来做插入和删除操作,栈顶放在链表的头部还是尾部呢?由于单链表有头指针,而栈顶指针也是必须的,那干吗不让它 ...
- 【小白成长撸】--链栈(C语言版)
// 链栈.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdio.h> #include <st ...
- C语言实现链栈的初始化&进栈&出栈&读取栈顶元素
/*链表实现栈的一系列操作*/ #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 typede ...
随机推荐
- UmBasketella
UmBasketella http://poj.org/problem?id=3737 Time Limit: 1000MS Memory Limit: 65536K Total Submissi ...
- eclipse项目运行文件位置
位置:E:\eclipseWorkSpace\.metadata\.plugins\org.eclipse.wst.server.core\tmp2\wtpwebapps\svnadmin
- Jedis cluster集群初始化源码剖析
Jedis cluster集群初始化源码剖析 环境 jar版本: spring-data-redis-1.8.4-RELEASE.jar.jedis-2.9.0.jar 测试环境: Redis 3.2 ...
- swift4.2 - UIDynamic
1. SB放上俩 imageview,拖线成类属性 import UIKit class ViewController: UIViewController { @IBOutlet weak var b ...
- selenium去掉下载弹窗
from selenium import webdriver import time import urllib2 class Download(): def __init__(self): self ...
- golang 创建一个简单的资源池,重用资源,减少GC负担
package main; import ( "sync" "errors" "fmt" ) //代码参考<Go语言实战>中第7 ...
- linux arm-linux-gcc 安装编译
1,将 .tgz 安装包通过SSH传至ubuntu 2,tar -zxvf arm-linux-gcc.tgz 解压 3,配置环境变量(由于鄙人只需其中一个用户使用,所以直接再其主目录) ...
- RibbonControl 工具栏上的一些基本操作
1:左上角图标的属性项 应用程序ico标 ribboncontrol默认 左上角图标区域隐藏,先转换成 ribbonFrom 然后区域出现 下一步修改此区域ico:右键ribbonControl1 属 ...
- C# oracle 日期型字段,使用参数传值时,遇到ORA-01810: format code appears twice错误
C#操作oracle数据库时,发现使用to_date('2014-01-03 18:00:00','yyyy-mm-dd hh:MM:ss')时,会出现ORA-01810: format code a ...
- 希尔排序和归并排序(java实现)
希尔排序 希尔排序算法实际上是一种特殊的插入排序,由DL.Shell于1959年提出而得名. 算法思想:希尔排序使数组中任意间隔为h的元素都是有序的,这些数组称为h有序数组,对于每个h,按插入排序进行 ...