#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
static int flag=0;
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
int InitStack(SqStack &S)
{
S.base=(int *)malloc(STACK_INIT_SIZE *sizeof(int));
if(!S.base)
printf("分配空间失败.\n");
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
printf("成功初始化栈.\n");
flag=1;
return 0;
}//构造一个空栈 S .
void DestroyStack(SqStack &S)
{
if(S.base!=0 && flag==1)
{
while(S.top!=S.base)
S.top--;
free(S.top);
S.base=NULL;
printf("成功销毁栈\n");
flag=0;
}
else
printf("无栈状态\n");
}//销毁栈S,S不再存在.
void ClearStack(SqStack &S)
{
int *p;
while(S.top!=S.base)
{
p=S.top;
S.top--;
}
printf("成功将栈重置.\n");
}//把S置为空栈.
void StackEmpty(SqStack &S)
{
if(S.top-S.base==S.stacksize)
printf("栈满状态.\n");
else if(S.top==S.base)
printf("空栈状态.\n");
else if(S.base==NULL)
printf("无栈状态.\n");
else
printf("存在栈,既不是空栈,也不是栈满\n");
}//判断是否为空栈.
void StackLength(SqStack &S)
{
int num=0;
SqStack L;
int *p;
L=S;
while(L.top!=L.base)
{
p=S.top;
L.top--;
num++;
}
printf("栈的长度是:%d\n",num);
}//返回栈的长度
/*void StackLength(SqStack &S)
{
int num=0;
num=S.top-S.base;
printf("栈的长度是:%d\n",num);
}*/
int GetTop(SqStack &S)
{
int e;
if(S.top==S.base)
{
printf("空栈状态,没有栈顶元素\n");
return ERROR;
}
e=*(S.top-1);
printf("栈顶元素是:%d\n",e);
return OK;
}//返回栈顶元素.
int Push(SqStack &S,int e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));
if(!S.base)
printf("存储分配空间.\n");
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
printf("成功插入该元素.\n");
return OK;
}//插入元素为新的栈顶元素.
int Pop(SqStack &S)
{
int e;
if(S.top==S.base)
printf("空栈状态,没有元素\n");
e=* --S.top;
printf("删除的栈顶元素是:%d\n",e);
return OK;
}//删除栈顶元素.
/*int Pop(SqStack &S)
{
int e;
if(S.top==S.base){
printf("空栈状态,没有元素\n");
return ERROR;
}
e=* --S.top;
printf("删除的栈顶元素是:%d\n",e);
return OK;
}*/
int StackTraverse(SqStack &S)
{
SqStack L;
int e;
L=S;
if(S.top==S.base)
{
printf("空栈,没有元素\n");
return ERROR;
}
printf("栈内元素是:\n");
while(L.top!=L.base)
{
e=*L.base;
L.base++;
printf("%15d\n",e);
}
return OK;
}//遍历栈.
void CreatSq(SqStack &S,int i)
{
int j;
S.base=(int *)malloc(STACK_INIT_SIZE *sizeof(int));
if(!S.base)
printf("分配空间失败.\n");
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
printf("请输入栈中元素:\n");
for(j=1;j<=i;j++)
{
printf("第%d个元素是:",j);
scanf("%d",S.top);
S.top++;
}
flag=1;
}//创建栈.
void Tips()
{
printf("******************************************************************************\n");
printf("************************ 1.初始化为空栈 ********************\n");
printf("************************ 2.销毁栈 ********************\n");
printf("************************ 3.将栈置空 ********************\n");
printf("************************ 4.判断栈是否为空栈 ********************\n");
printf("************************ 5.返回栈的长度 ********************\n");
printf("************************ 6.求栈顶元素 ********************\n");
printf("************************ 7.插入元素,并使其成为栈顶元素 ********************\n");
printf("************************ 8.删除栈顶元素,并返回其值 ********************\n");
printf("************************ 9.输出栈内元素 ********************\n");
printf("************************ 10.创建并输入栈元素 ********************\n");
printf("************************ 11.退出 ********************\n");
printf("******************************************************************************\n");
}
int main()
{
int a,b,i;
int just=0;
SqStack S;
do
{
system("cls");
Tips();
printf("请输入选择:");
scanf("%d",&i);
switch(i)
{
case 1:InitStack(S);just=1;break;
case 2: DestroyStack(S);just=0;break;
case 3:{
if(just==0)
printf("无栈状态.\n");
else
{
ClearStack(S);
just=1;
}
break;
}
case 4:{
if(just==0)
printf("无栈状态.\n");
else
StackEmpty(S);
break;
}
case 5:{
if(just==0)
printf("无栈状态.\n");
else
StackLength(S);
break;
}
case 6:{
if(just==0)
printf("无栈状态.\n");
else
GetTop(S);
break;
}
case 7:{
if(just==0)
printf("无栈状态.\n");
else
{
printf("请输入插入的栈顶元素:");
scanf("%d",&b);
Push(S,b);
}
break;
}
case 8:{
if(just==0)
printf("无栈状态.\n");
else
Pop(S);
break;
}
case 9:{
if(just==0)
printf("无栈状态.\n");
else
StackTraverse(S);
break;
}
case 10:{
printf("请输入栈的长度:");
scanf("%d",&a);
CreatSq(S,a);
just=1;
break;
}
case 11:printf("操作结束.\n");exit(0);
default:printf("没有该选项,请重新操作.\n");break;
}
system("pause");
}while(1);
return 0;
}
数据结构之对顺序栈的操作(C语言版)
最新推荐文章于 2021-08-28 20:08:58 发布