1.顺序栈,可以实现以下功能
代码如下
#include "stdio.h"
#define MAXSIZE 100
#define DateType int
typedef struct{
DateType data[MAXSIZE];
int top;
}SeqStack,*PSeqStack;
/*创建一个顺序栈,入口参数无,返回一个指向顺序栈的指针,为0表示分配空间失败*/
PSeqStack Init_SeqStack(void)
{
PSeqStack S;
S = (PSeqStack)malloc(sizeof(SeqStack));
if(S)
S->top = -1;
return S;
}
/*判断栈是否为空,入口参数:顺序栈,返回值:1表示为空,0表示非空*/
int Empty_SeqStack(PSeqStack S)
{
if(S->top == -1)
return 1;
else
return 0;
}
/*在栈顶插入一个新元素,入口参数:顺序栈,新元素,返回值:1表示成功,0表示失败*/
int Push_SeqStack(PSeqStack S,DateType x)
{
if(S->top == MAXSIZE - 1)
{
printf("栈满\n");
return 0;
}
else
{
S->top++;
S->data[S->top] = x;
return 1;
}
}
/*删除栈顶元素并保留在*x中,入口参数:顺序栈,*x,返回值:1表示成功,0表示失败*/
int Pop_SeqStack(PSeqStack S,DateType *x)
{
if(Empty_SeqStack(S))
{
printf("栈空\n");
return 0;
}
else
{
*x = S->data[S->top];
printf("出栈元素为:%d\n",*x);
S->top--;
return 1;
}
}
/*取得栈顶元素,入口参数:顺序栈,*X,返回值:1表示成功,0表示失败*/
int GetTop_SeqStack(PSeqStack S,DateType *X)
{/*用指针*X带出栈顶值**/
if(Empty_SeqStack(S))
{
printf("栈空\n");
return 0;
}
else
{
*X = S->data[S->top];
printf("栈顶元素是:%d\n",*X);
return 1;
}
}
/*销毁栈,入口参数:顺序栈,无返回值**/
void Destory_SeqStack(PSeqStack *S)
{
if(*S)
free(*S);
*S = NULL;
return;
}
int main()
{
int n,m,x;
int *p;
PSeqStack S;
S = (PSeqStack)malloc(sizeof(SeqStack));
S = Init_SeqStack();
while(1)
{
printf("/**这是一个顺序栈,请输入一个相对应的操作**/\n");
printf("/*************1:判断栈是否为空************/\n");
printf("/*************2:入栈 ************/\n");
printf("/*************3:出栈 ************/\n");
printf("/*************4:获取栈顶元素 ************/\n");
printf("/*************5:退出 ************/\n");
scanf("%d",&n);
switch(n)
{
case 1: m = Empty_SeqStack(S);
if(m == 0)
printf("栈非空\n");
if(m == 1)
printf("栈空\n");
break;
case 2: printf("请输入要入栈的元素:\n");
scanf("%d",&x);
m = Push_SeqStack(S,x);
if(m == 1)
printf("成功\n");
if(m == 0)
printf("不成功\n");
break;
case 3: m = Pop_SeqStack(S,&p);
if(m == 1)
printf("成功\n");
if(m == 0)
printf("不成功\n");
break;
case 4: m = GetTop_SeqStack(S,&p);
if(m == 1)
printf("成功\n");
if(m == 0)
printf("不成功\n");
break;
case 5: Destory_SeqStack(&S);
return;
}
}
return 0;
}
2.链栈,可以实现以下功能
代码如下:
#include "stdio.h"
#define DateType int
typedef struct node{
DateType data;
struct node *next;
}StackNode,*PStackNode;
typedef struct{
PStackNode top; //指向StackNode类型的指针
}LinkStack,*PLinkStack;
PLinkStack Init_LinkStack(void)
{/*初始化链栈,入口参数:空,返回值:链栈指针,NULL表示初始化失败*/
PLinkStack S;
S = (PLinkStack)malloc(sizeof(LinkStack));
if(S)
S->top = NULL;
return S;
}
int Empty_LinkStack(PLinkStack S)
{/*判断链栈是否为空,入口参数:链栈指针,返回值:1表示栈空,0表示非空*/
return (S->top == NULL);
}
int Push_LinkStack(PLinkStack S,DateType x)
{/*进栈,入口参数:链栈指针,进栈元素,返回值:1表示成功,0表示失败*/
PStackNode p;
p = (PStackNode)malloc(sizeof(StackNode));
if(!p)
{
printf("内存溢出!\n");
return 0;
}
p->next = S->top;
S->top = p;
p->data = x;
return 1;
}
int Pop_LinkStack(PLinkStack S,DateType *x)
{/*进栈,入口参数:链栈指针,*x,返回值:1表示成功,0表示失败*/
PStackNode p;
if(Empty_LinkStack(S))
{
printf("栈空,不能出栈!\n");
return 0;
}
*x = S->top->data;
printf("出栈元素为:%d\n",*x);
p = S->top;
S->top = S->top->next;
free(p);
return 1;
}
int GetTop_LinkStack(PLinkStack S,DateType *X)
{/*取得栈顶元素,入口参数:链栈指针,*X,返回值:1表示成功,0表示失败,用指针*X带出栈顶值*/
if(Empty_LinkStack(S))
{
printf("栈空\n");
return 0;
}
*X = S->top->data;
printf("栈顶元素是:%d\n",*X);
return 1;
}
void Destory_LinkStack(PLinkStack *LS)
{/*销毁栈,入口参数:链栈指针地址,无返回值*/
PStackNode p,q;
if(*LS)
{
p = (*LS)->top;
while(p)
{
q = p;
p = p->next;
free(q);
}
free(*LS);
}
*LS = NULL;
}
int main()
{
int n,m,x;
int *p;
PLinkStack S;
S = (PLinkStack)malloc(sizeof(LinkStack));
S = Init_LinkStack();
while(1)
{
printf("/***这是一个链栈,请输入一个相对应的操作***/\n");
printf("/*************1:判断栈是否为空************/\n");
printf("/*************2:入栈 ************/\n");
printf("/*************3:出栈 ************/\n");
printf("/*************4:获取栈顶元素 ************/\n");
printf("/*************5:退出 ************/\n");
scanf("%d",&n);
switch(n)
{
case 1: m = Empty_LinkStack(S);
if(m == 1)
printf("栈空\n");
if(m == 0)
printf("栈非空\n");
break;
case 2: printf("请输入要入栈的元素:\n");
scanf("%d",&x);
m = Push_LinkStack(S,x);
if(m == 1)
printf("成功\n");
if(m == 0)
printf("不成功\n");
break;
case 3: m = Pop_LinkStack(S,&p);
if(m == 1)
printf("成功\n");
if(m == 0)
printf("不成功\n");
break;
case 4: m = GetTop_LinkStack(S,&p);
if(m == 1)
printf("成功\n");
if(m == 0)
printf("不成功\n");
break;
case 5: Destory_LinkStack(&S);
return;
}
}
return 0;
}