栈的定义及基本操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
栈的定义及基本操作
在数据结构中, 栈是限制在表的一端进行插入和删除的线性表。
在线性表中允许插入、 删除 的这一端称为栈顶, 栈顶的当前位置是动态变化的, 这样我们只能在栈顶对栈进行操作; 不 允许插入和删除的另一端称为栈底,栈底是固定不变得,当表中没有元素时称为空栈。
对栈的常用操作有:
栈初始化: Init_Stack()
判断空: Empty_Stack()
入栈: Push_Stack(S,x) typedef{
DataType data[STACKSIZE];
int top;
}SeqStack,*PSeqStack ; 下面用一个实例介绍栈的一些基本操作 (经过测试 ):
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define STACKSIZE 100
typedef struct{
int data[STACKSIZE];
int top;
}SeqStack,*PSeqStack;
PSeqStack Init_SeqStack()
{
PSeqStack S;
S=(PSeqStack)malloc(sizeof(SeqStack));
if(S!=NULL)
初始条件:栈不存在 操作结果:构造了一个空栈 若栈空,则返回为 1,否则返
回 0
初始条件:栈S 已经存在 操作结果:在栈S 的顶部插入一 个元素x ,这
样x 就、成为新的栈顶元素。
出栈: Pop_Stack(S,&x) 从栈顶删除,保存在变量 x 中 取栈顶元素: GetTop_Stack(S) 顶元素,且原栈的结构不会变化 销毁栈: Destory_Stack(S) 在的栈 栈的存储方式: (1)顺序存储 下面我分别介绍这两种的实现: 顺序存储 顺序存储中用 int data[STACKSIZE] 来存放所有的入栈元素,栈底的位置可以设置固 定在数组的
任意一端,栈顶指示实际的栈顶元素位置,它是随着插入和删除是动态变化的, 用 int top 变量来指示栈顶的位置 将 data 和 top 封装在一个结构中
#define MAXSIZE 100 初始条件:栈 初始条件: 初始条件: S 存在且不为空 操作结果:栈S 的顶部元素
栈s 存在且不为空 操作结果:返回栈S 的栈
栈 S 已经存在 操作结果: 销毁一个已经存
2)链式存储
S->top=-1; return S;
int Empty_SeqStack(PSeqStack S) {
if(S->top==-1)
return 1;
else return 0;
}
int Push_SeqStack(PSeqStack S,int x) { if(S->top==STACKSIZE-1)
return 0;
else{
S->top++;
S->data[S->top]=x;
return 1;
}
}
int Pop_SeqStack(PSeqStack S,int *x) {
if(Empty_SeqStack(S)==1)
return 0;
else{
*x=S->data[S->top];
S->top--;
return 1;
}
}
int GetTop_SeqStack(PSeqStack S)
{
if(Empty_SeqStack(S)==1){
printf("Empty Stack!\n");
return -1;
}
else
return S->data[S->top];
}
int Destory_SeqStack(PSeqStack *S)
{
if(*S){
free(*S);
*S=NULL;
return 1;
}
}
return 0;
}
int main()
{
PSeqStack s;
int x=0;
s=Init_SeqStack();
Push_SeqStack(s,1);
Push_SeqStack(s,2);
Push_SeqStack(s,3);
Push_SeqStack(s,4); printf("Top:%d ",GetTop_SeqStack(s)); Destory_SeqStack(&s); return 1;
} 链式存储栈的链式存储一般用单链表来实现,实现代码如下:
#include<stdio.h>
#include<stdlib.h> #include<malloc.h> #define STACKSIZE 100 typedef struct LinkStack{ int data;
struct LinkStack *next; }LinkStackNode,*PLinkStackNode; typedef struct{ PLinkStackNode top;
}LinkStack,*PLinkStack;
PLinkStack Init_LinkStack()
{
PLinkStack s; s=(PLinkStack)malloc(sizeof(LinkStack)); if(s)
s->top=NULL;
return s;
}
int Empty_LinkStack(PLinkStack S)
{
if(S->top==NULL)
return 1;
else return 0;
int Push_LinkStack(PLinkStack S,int x)
{
PLinkStackNode p; p=(PLinkStackNode)malloc(sizeof(LinkStackNode)); if(p!=NULL){ p->data=x;
p->next=S->top;
S->top=p;
return 1;
}else
return 0;
}
int Pop_LinkStack(PLinkStack S,int *x) {
PLinkStack p;
if(Empty_LinkStack(S)==1) return 0;
else{
p=S;
*x=S->top->data;
S->top=S->top->next;
free(p);
return 1;
}
}
int GetTop_LinkStack(PLinkStack S)
{
if(Empty_LinkStack(S)==1){
printf("Empty Stack!\n");
return -1;
}
else
return S->top->data;
}
int Destory_LinkStack(PLinkStack *S)
{
PLinkStackNode p,q;
if(*S){
p=(*S)->top; while(p){ q=p;
p=p->next;
free(q);
}
free(*S);
}
*S=NULL;
return 1;
}
int main()
{
PLinkStack s;
int x=0;
s=Init_LinkStack();
Push_LinkStack(s,1);
Push_LinkStack(s,2);
Push_LinkStack(s,3);
Push_LinkStack(s,6);
printf("Top:%d ",GetTop_LinkStack(s)); Destory_LinkStack(&s);
return 1;
}。