栈
定义
基本操作
顺序存储结构
链式存储结构
栈
定义:只允许在一端进行插入或删除的线性表。
InitStack(&S);初始化一个空栈
StackEmpty(&S);判断一个栈是否为空
Push(&S, x);进栈(若未满
Pop(&S, &x);出栈(若非空)
GetTop(S, &x);读取栈顶元素(若非空,用x返回栈顶元素)
ClearStack(&S);销毁栈,并释放栈S所用的存储空间
栈的顺序存储结构
#include<cstdio>
#define Maxsize 50
typedef struct{
int data[Maxsize];
int top;
}SqStack;
void InitStack(SqStack &S){
S.top = -1;
}
bool StackEmpty(SqStack &S){
if(S.top == -1)
return true;
return false;
}
bool Push(SqStack &S, int x){
if(S.top == Maxsize - 1)
return false;
S.data[++S.top] = x;
return true;
}
bool Pop(SqStack &S, int &x){
if(S.top == -1)
return false;
x = S.data[S.top--];
return true;
}
bool GetTop(SqStack &S, int &x){
if(S.top == -1)
return false;
x = S.data[S.top];
return true;
}
bool ClearStack(SqStack &S){
//free(S);
}
int main()
{
SqStack s;
InitStack(s);
for(int i = 0; i < 10; i++)
if(Push(s,i))
printf("%d入栈\n", i);
while(!StackEmpty(s)){
int x;
GetTop(s, x);
printf("栈顶元素是%d\n", x);
if(Pop(s, x))
printf("%d出栈\n", x);
}
ClearStack(s);
return 0;
}
栈的链式存储结构
#include<cstdio>
#include<cstdlib>
typedef struct Linknode{
int data;
struct Linknode *next;
} *LiStack;//栈结点类型指针
void InitStack(LiStack &S){
S = NULL;
}
bool StackEmpty(LiStack &S){
if(S == NULL)
return true;
return false;
}
//不带头结点的头插法
bool Push(LiStack &S, int x){
Linknode* n = NULL;
n = (Linknode*)malloc(sizeof(Linknode));
if(!n)
return false;
n->data = x;
n->next = S;
S = n;
return true;
}
bool Pop(LiStack &S, int &x){
if(!S)
return false;
x = S->data;
Linknode *p = S;
S = S->next;
free(p);
return true;
}
bool GetTop(LiStack &S, int &x){
if(!S)
return false;
x = S->data;
return true;
}
bool ClearStack(LiStack &S){
Linknode *p = S;
while(p != NULL){
Linknode *t = p;
p = p->next;
free(t);
p = p->next;
}
free(p);
}
int main()
{
LiStack s;
InitStack(s);
for(int i = 0; i < 10; i++)
if(Push(s,i))
printf("%d入栈\n", i);
while(!StackEmpty(s)){
int x;
GetTop(s, x);
printf("栈顶元素是%d\n", x);
if(Pop(s, x))
printf("%d出栈\n", x);
}
ClearStack(s);
return 0;
}