链栈的基本操作
2016-12-16 16:13
537 查看
链栈的基本操作
定义结构体
链栈的基本操作
压栈
读栈
弹栈
求栈的长度
1.定义
1.1栈
栈(stack)是一种特殊的线性表.栈是限定结点插入和删除只能在同一端进行的线性表.栈犹如一个一端开口一端封闭的容器.可插入和删除的一端称为栈顶,另一端称为栈底.
”栈顶指针”:指示最后插入栈中的结点位置,处于栈顶位置的结点称为栈顶结点.”栈底指针”:指示栈底位置,它始终指向最先插入的结点的下面位置.
不含任何结点的栈称为”空栈”.栈为空时,栈顶指针和栈底指针重合.
栈的插入形象地称为”压栈”.删除称为弹栈.
栈的重要特点,最后压入的结点最先弹出,最先压入的结点只能最后弹出.因此,栈又称为后进先出表,或称LIFO表(Last In First Out).
1.2链栈
链存储结构存储的栈称为链栈.链栈的结点由结点数据和next指针构成.用头指针指向链栈的栈顶指针,其余结点通过next指针链接起来;栈底结点的next指针值为空.因为插入和删除总店链的头部进行,所以头指针也是栈顶指针;栈顶指针唯一确定一个链栈.因为链栈没有容量的限制,所以在可用的存储空间范围内一般不会出现上溢问题.2.结构体
在StackListCs.c# define DT char typedef struct stack{ DT data; struct stack *next; }STACKNODE;
data为结点数据域,next为结点指针域.
根据结点类型定义一个链栈
STACKNODE *top;
top为栈名,链头指针,也是栈顶指针.创建新栈时top的值为空.
3.链表操作
3.1压栈
在StackListControl.h写出方法声明/* 压栈 */ STACKNODE * pussListStack(STACKNODE *LS,char x);
在StackListControl.c中实现此方法
#include "StackListControl.h" /* 压栈 */ STACKNODE * pussListStack(STACKNODE *LS,char x){ //1.创建一个新的结点 STACKNODE *q; q=(STACKNODE *)malloc(sizeof(STACKNODE)); //2.设置data和指针域指针值 q->data=x; q->next=LS; //3.将栈顶指针指向新插入结点 LS=q; return LS; }
3.2读栈
在StackListControl.h写出方法声明/* 读栈 */ DT getListStack(STACKNODE *LS);
在StackListControl.c中实现此方法
DT getListStack(STACKNODE *LS){ DT t; //1.查看LS是否为NULL if(LS==NULL){ printf("stack empty!\n"); }else{ //2.读取栈顶数据 t=LS->data; } return t; }
3.3弹栈
在StackListControl.h写出方法声明/* 弹栈 */ STACKNODE *popListStack(STACKNODE *LS);
在StackListControl.c中实现此方法
STACKNODE *popListStack(STACKNODE *LS){ STACKNODE *q; //1.先判断栈是否为NULL if(LS==NULL){ printf("Empty Stack!\n"); }else{ //2.先存储栈顶指针 q=LS; //3.栈顶指针向下移动一位 LS=q->next; } return LS; }
3.4求栈长度
在StackListControl.h写出方法声明/* 求栈的长度 */ int lengthListStack(STACKNODE *LS);
在StackListControl.c中实现此方法
int lengthListStack(STACKNODE *LS){ int len=0; if(LS==NULL){ return 0; }else{ do{ len++; LS=LS->next; }while(LS!=NULL) ; } return len; }
在main.c中的main方法(int main(int argc, const char * argv[]) {})调用此方法,并且进行判断
#include "StackListControl.h" int main(int argc, const char * argv[]) { //1.链栈-->压栈 printf("压栈\n"); STACKNODE *LS; LS=pussListStack(LS, 'a'); LS=pussListStack(LS, 'b'); LS=pussListStack(LS, 'c'); //求栈长度 printf("求栈长度\n"); int len=lengthListStack(LS); printf("len=%d\n",len); //读栈 printf("读栈\n"); DT t=getListStack(LS); printf("t=%c\n",t); //弹栈 printf("弹栈\n"); LS=popListStack(LS); //求栈长度 printf("求栈长度\n"); len=lengthListStack(LS); printf("len=%d\n",len); return 0; }
打印结果:
压栈 求栈长度 len=3 读栈 t=c 弹栈 求栈长度 len=2
这是链栈基本操作,请大家指点,有好的建议请大家指出,有好的书籍,还往大家推荐!
源码下载
链栈的基本操作
定义
1栈
2链栈
结构体
链表操作
1压栈
2读栈
3弹栈
4求栈长度
相关文章推荐
- C++基于栈实现铁轨问题
- 浅析C语言中堆和栈的区别
- C语言栈的表示与实现实例详解
- C语言实现颠倒栈的方法
- 算法系列15天速成 第十天 栈
- 一看就懂:图解C#中的值类型、引用类型、栈、堆、ref、out
- Array栈方法和队列方法的特点说明
- C#创建安全的栈(Stack)存储结构
- C语言对栈的实现基本操作
- java数据结构之java实现栈
- 浅析栈区和堆区内存分配的区别
- C语言 数据结构中栈的实现代码
- C语言 栈的表示和实现详细介绍
- 用Java代码实现栈数据结构的基本方法归纳
- 用PHP解决的一个栈的面试题
- 浅谈C#中堆和栈的区别(附上图解)
- C#使用Object类实现栈的方法详解
- JavaScript数据结构与算法之栈详解
- 浅析顺序结构存储的栈
- C语言之栈和堆(Stack && Heap)的优缺点及其使用区别