您的位置:首页 > 其它

链栈的基本操作

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求栈长度
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息