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