InitStack(&S):初始化栈。构造一个空栈 S,分配内存空间。
DestroyStack(&S):销毁栈。销毁并释放栈 S 所占用的内存空间。
Push(&S,x):进栈,若栈S未满,则将x加入使之成为新栈顶。
Pop(&S,&x):出栈,若栈S非空,则弹出栈顶元素,并用x返回。
GetTop(S, &x):读栈顶元素。若栈 S 非空,则用 x 返回栈顶元素
其他常用操作:
StackEmpty(S):判断一个栈 S 是否为空。若S为空,则返回true,否则返回false。
//不带头结点的栈
//进栈 ->单链表的插入 链头作为栈顶
//出栈->单链表的删除
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LiStack;
//不带头结点的:
//1、初始化栈。构造一个空栈 S,分配内存空间。
bool InitStack(LiStack &S){
S = NULL;
return true;
}
//2、判断栈是否为空
bool StackEmpty(LiStack S){
return (S == NULL);
}
//3、进栈,若栈S未满,则将x加入使之成为新栈顶。//头插法
LiStack Push(LiStack &S){
LNode *t;
int x;
scanf("%d",&x);
while(x!=9999){
t=(LNode*)malloc(sizeof(LNode));
t->data=x;
t->next=S;
S=t;
scanf("%d",&x);
}
return S;
}
//4、Pop(&S,&x):出栈,若栈S非空,则弹出栈顶元素,并用x返回。//删除结点 (删除第1个结点)
bool Pop(LiStack &S, int &x){
if(!StackEmpty(S)){
x=S->data;
S=S->next;
return true;
}
else return false;
}
//5、GetTop(S, &x):读栈顶元素。若栈 S 非空,则用 x 返回栈顶元素
bool GetPop(LiStack &S, int &x){
if(!StackEmpty(S)){
x=S->data;
return true;
}
else return false;
}
//6、打印
void PrintStack(LiStack S){
LNode *p=S;
while(p){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int main(void){
LiStack S;
int x;
InitStack(S);
Push(S);
PrintStack(S);
if(Pop(S,x))
PrintStack(S);
if(GetPop(S,x))
printf("x=%d\n",x);
return 0;
}
/*
1 2 3 4 5 6 7 9999
*/