栈的定义及基本操作.docx
《栈的定义及基本操作.docx》由会员分享,可在线阅读,更多相关《栈的定义及基本操作.docx(8页珍藏版)》请在冰豆网上搜索。
![栈的定义及基本操作.docx](https://file1.bdocx.com/fileroot1/2022-12/12/040b8b43-640f-4940-9d9d-b3f0475f070e/040b8b43-640f-4940-9d9d-b3f0475f070e1.gif)
栈的定义及基本操作
栈的定义及基本操作
栈的定义及基本操作
在数据结构中,栈是限制在表的一端进行插入和删除的线性表。
在线性表中允许插入、删除的这一端称为栈顶,栈顶的当前位置是动态变化的,这样我们只能在栈顶对栈进行操作;不允许插入和删除的另一端称为栈底,栈底是固定不变得,当表中没有元素时称为空栈。
对栈的常用操作有:
栈初始化:
Init_Stack()初始条件:
栈不存在操作结果:
构造了一个空栈
判断空:
Empty_Stack()若栈空,则返回为1,否则返回0
入栈:
Push_Stack(S,x)初始条件:
栈S已经存在操作结果:
在栈S的顶部插入一个元素x,这样x就、成为新的栈顶元素。
出栈:
Pop_Stack(S,&x)初始条件:
栈S存在且不为空操作结果:
栈S的顶部元素从栈顶删除,保存在变量x中
取栈顶元素:
GetTop_Stack(S)初始条件:
栈s存在且不为空操作结果:
返回栈S的栈顶元素,且原栈的结构不会变化
销毁栈:
Destory_Stack(S)初始条件:
栈
if(S->top==STACKSIZE-1)
return0;
else{
S->top++;
S->data[S->top]=x;
return1;
}
}
intPop_SeqStack(PSeqStackS,int*x)
{
if(Empty_SeqStack(S)==1)
return0;
else{
*x=S->data[S->top];
S->top--;
return1;
}
}
intGetTop_SeqStack(PSeqStackS)
{
if(Empty_SeqStack(S)==1){
printf("EmptyStack!
\n");
return-1;
}
else
returnS->data[S->top];
}
intDestory_SeqStack(PSeqStack*S)
{
if(*S){
free(*S);
*S=NULL;
return1;
}
return0;
}
intmain()
{
PSeqStacks;
intx=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);
return1;
}
链式存储
栈的链式存储一般用单链表来实现,实现代码如下:
#include
#include
#include
#defineSTACKSIZE100
typedefstructLinkStack{
intdata;
structLinkStack*next;
}LinkStackNode,*PLinkStackNode;
typedefstruct{
PLinkStackNodetop;
}LinkStack,*PLinkStack;
PLinkStackInit_LinkStack()
{
PLinkStacks;
s=(PLinkStack)malloc(sizeof(LinkStack));
if(s)
s->top=NULL;
returns;
}
intEmpty_LinkStack(PLinkStackS)
{
if(S->top==NULL)
return1;
elsereturn0;
}
intPush_LinkStack(PLinkStackS,intx)
{
PLinkStackNodep;
p=(PLinkStackNode)malloc(sizeof(LinkStackNode));
if(p!
=NULL){
p->data=x;
p->next=S->top;
S->top=p;
return1;
}else
return0;
}
intPop_LinkStack(PLinkStackS,int*x)
{
PLinkStackp;
if(Empty_LinkStack(S)==1)
return0;
else{
p=S;
*x=S->top->data;
S->top=S->top->next;
free(p);
return1;
}
}
intGetTop_LinkStack(PLinkStackS)
{
if(Empty_LinkStack(S)==1){
printf("EmptyStack!
\n");
return-1;
}
else
returnS->top->data;
}
intDestory_LinkStack(PLinkStack*S)
{
PLinkStackNodep,q;
if(*S){
p=(*S)->top;
while(p){
q=p;
p=p->next;
free(q);
}
free(*S);
}
*S=NULL;
return1;
}
intmain()
{
PLinkStacks;
intx=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);
return1;
}