链栈的基本操作
链栈的基本操作定义结构体链栈的基本操作压栈读栈弹栈求栈的长度1.定义1.1栈栈(stack)是一种特殊的线性表.栈是限定结点插入和删除只能在同一端进行的线性表.栈犹如一个一端开口一端封闭的容器.可插入和删除的一端称为栈顶,另一端称为栈底.”栈顶指针”:指示最后插入栈中的结点位置,处于栈顶位置的结点称为栈顶结点.”栈底指针”:指示栈底位置,它始终指向最先插入的结点的下面
链栈的基本操作
- 定义
- 结构体
- 链栈的基本操作
- 压栈
- 读栈
- 弹栈
- 求栈的长度
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
这是链栈基本操作,请大家指点,有好的建议请大家指出,有好的书籍,还往大家推荐!
更多推荐
所有评论(0)