概述
三段代码分别是栈的顺序存储,带头结点的链式存储,不带头结点的链式存储。
都包括着初始化、判空、进栈、建立栈表、出栈,读取栈顶元素、遍历操作,方便大家调试。
顺序存储
#include<stdio.h>
#include<stdlib.h>
#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;
else
return false;
}
bool Push(SqStack &S,int x) //进栈
{
if(S.top == MaxSize-1) //栈满报错
return false;
S.data[++S.top] = x; //注意入栈是指针先加一,再入栈
return true;
}
SqStack CreateStack(SqStack &S)
{
int x = 0;
scanf("%d",&x);
while(x!=9999)
{
Push(S,x); //调用进栈函数
scanf("%d",&x);
}
return S;
}
bool Pop(SqStack &S,int &x) //出栈
{
if(S.top == -1) //栈空报错
return false;
x=S.data[S.top--];
printf("出栈元素为:%d\n",x);
return true;
}
bool GetTop(SqStack S,int &x) //读取栈顶元素
{
if(S.top == -1)
return false;
x=S.data[S.top];
return true;
}
void Print(SqStack S) //遍历
{
while(S.top != -1)
{
printf("%d ",S.data[S.top--]);
}
}
int main()
{
int x = 0;
SqStack S;
InitStack(S);
CreateStack(S); //创建栈
Push(S,666); //再进一个元素
Pop(S,x); //出栈,并用x返回栈顶元素
Print(S);
return 0;
}
带头结点的链式存储
#include<stdio.h>
#include<stdlib.h>
typedef struct StackNode{
int data;
struct StackNode *next;
}StackNode,*LiStack;
void InitStack(LiStack &S) //带头结点的链栈初始化
{
S=(StackNode *)malloc(sizeof(StackNode));
S->next=NULL;
}
bool StackEmpty(LiStack S) //判空
{
if(S->next==NULL)
return true;
else
return false;
}
bool Push(LiStack &S,int x) //进栈
{
StackNode *p=S;
StackNode *o;
o=(StackNode *)malloc(sizeof(StackNode));
o->data = x;
o->next = p->next ;
p->next = o;
return true;
}
LiStack CreateStack(LiStack &S) //调用Push函数建立链栈
{
int x = 0;
scanf("%d",&x);
while(x!=9999)
{
Push(S,x);
scanf("%d",&x);
}
return S;
}
bool Pop(LiStack &S,int &x) //出栈 ,用x返回出栈的值
{
StackNode *p = S;
if(p->next ==NULL)
return false;
StackNode *D = p->next ;
x = D->data ;
p->next =D->next ;
free(D);
return true;
}
bool GetTop(LiStack S,int &x) //读取栈顶元素,并用x返回其值
{
StackNode *p=S;
if(p->next == NULL)
return false;
x=p->next->data ;
printf("栈顶元素X=%d\n",x);
return true;
}
void Print(LiStack S) //遍历
{
StackNode *p = S->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next ;
}
}
int main()
{
int x = 0;
LiStack S; //声明
InitStack(S); //初始化
CreateStack(S); //创建
// Push(S,666); //进栈
// Pop(S,x); //出栈
GetTop(S,x); //读取栈顶元素
Print(S);
return 0;
}
不带头结点的链式存储
#include<stdio.h>
#include<stdlib.h>
typedef struct StackNode{
int data;
struct StackNode *next;
}StackNode,*LiStack;
void InitStack(LiStack &S) //初始化不带头结点的链栈
{
S=NULL;
}
bool StackEmpty(LiStack S) //判空
{
if(S==NULL)
return true;
else
return false;
}
bool Push(LiStack &S,int x) //进栈
{
StackNode *N;
N=(StackNode *)malloc(sizeof(StackNode));
N->data = x;
N->next = S; //注意这里头插法方式的不同之处
S = N;
return true;
}
LiStack CreateStack(LiStack &S) //创建栈
{
int x = 0;
printf("请输入入栈函数:");
scanf("%d",&x);
while(x!=9999)
{
Push(S,x);
scanf("%d",&x);
}
return S;
}
bool Pop(LiStack &S,int &x) //出栈
{
if(S==NULL)
return false;
StackNode *p=S;
x=p->data ;
S=p->next ;
free(p);
return true;
}
bool GetTop(LiStack S,int &x) //读取栈顶元素
{
if(S==NULL)
return false;
x=S->data ;
printf("栈顶元素为:%d \n",x);
return true;
}
void Print(LiStack S) //遍历
{
while(S!=NULL)
{
printf("%d ",S->data);
S=S->next ;
}
}
int main()
{
int x = 0;
LiStack S;
InitStack(S);
CreateStack(S);
// Push(S,666);
//Pop(S,x);
GetTop(S,x);
Print(S);
return 0;
}