#include <stdio.h>
#include <stdlib.h>
#define M 10
#define N 5
int flag=0;
typedef struct SeqStack
{
char *top;
char *base;
int stacksize;
}SeqStack;
void InitStack(SeqStack *S)
{
S->base=(char *)malloc(M*sizeof(char));
S->top=S->base;
S->stacksize=M;
}
void CreateStack(SeqStack *S)
{
if(flag==1)
printf("顺序栈已经创建!\n");
else
{
int i,length;
char ch;
printf("请输入要创建顺序栈的长度:\n");
scanf("%d",&length);
for(i=0;i<length;i++)
{
printf("请输入顺序栈的元素:\n");
scanf("%c",&ch);
if((ch=getchar())!='\n')
*S->top++=ch;
}
flag=1;
printf("顺序栈创建完成!\n");
}
}
void PushStack(SeqStack *S)
{
if(flag==0)
printf("顺序栈未创建,无法进行入栈操作!\n");
else
{
char e;
printf("请输入入栈的元素!\n");
e=getchar();
scanf("%c",&e);
if(S->stacksize<=S->top-S->base)
{
S->base=(char *)realloc(S->base,(S->stacksize+N)*sizeof(char));
S->top=S->base+S->stacksize;
S->stacksize+=N;
}
*S->top++=e;
printf("入栈操作成功!\n");
}
}
void PopStack(SeqStack *S)
{
if(flag==0)
printf("顺序栈未创建,无法进行出栈操作!\n");
else
{
if(S->base==S->top)
printf("顺序栈为空,无法进行出栈操作!\n");
else
{
char ch;
ch=*--S->top;
printf("顺序栈出栈成功,出栈元素为%c\n",ch);
}
}
}
void StackLength(SeqStack S)
{
int len;
if(flag==0)
printf("顺序栈未创建,无法计算栈长度!\n");
else
{
len=S.top-S.base;
printf("顺序栈的长度为:%d\n",len);
}
}
int StackEmpty(SeqStack S)
{
if(flag==0)
printf("顺序栈未创建,无法判断是否为空!\n");
else
{
if(S.base==S.top)
{
printf("顺序栈为空!\n");
return 1;
}
else
printf("顺序栈不为空!\n");
}
return 0;
}
void DisplayStack(SeqStack S)
{
if(flag==0)
printf("顺序栈未创建,无法显示!\n");
else
{
char *r,*p=--S.top;
char *q=S.base;
printf("顺序栈的显示顺序为:\n");
for(r=p;r>=q;r--)
printf("%c ",*r);
printf("\n");
}
}
void DestoryStack(SeqStack *S)
{
if(flag==0)
printf("顺序栈未创建,不需要销毁!\n");
else
{
free(S->base);
flag=0;
printf("顺序栈已成功被销毁!\n");
}
}
void menu()
{
printf("\t顺序栈基本实验操作\n");
printf("*********************************\n");
printf("1 建立顺序栈!\t\t\t*\n");
printf("2 顺序栈入栈操作!\t\t*\n");
printf("3 顺序栈出栈操作!\t\t*\n");
printf("4 求顺序栈长度!\t\t*\n");
printf("5 判断顺序栈是否为空!\t\t*\n");
printf("6 显示顺序栈!\t\t\t*\n");
printf("7 销毁顺序栈!\t\t\t*\n");
printf("0 退出程序!\t\t\t*\n");
printf("*********************************\n");
}
int main()
{
int select;
SeqStack ptr;
InitStack(&ptr);
while(1)
{
menu();
printf("请输入选择命令:\n");
scanf("%d",&select);
switch(select)
{
case 1:
CreateStack(&ptr);
break;
case 2:
PushStack(&ptr);
break;
case 3:
PopStack(&ptr);
break;
case 4:
StackLength(ptr);
break;
case 5:
StackEmpty(ptr);
break;
case 6:
DisplayStack(ptr);
break;
case 7:
DestoryStack(&ptr);
break;
case 0:
exit(1);
break;
default :
printf("命令输入有误,请重新输入!\n");
break;
}
}
return 0;
}
这个我自己测试了一下。感觉没什么问题。其实也不知道到底有没有问题!发现问题,希望大家能指出!