C语言实现顺序栈
#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
typedef int status;
typedef int SElemType;
typedef struct{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
status InitStack(SqStack *S);
status DestroyStack(SqStack *S);
status ClearStack(SqStack *S);
status StackEmpty(SqStack S);
int StackLength(SqStack S);
status GetTop(SqStack S,SElemType *e);
status Push(SqStack *S,SElemType e);
status Pop(SqStack *S,SElemType *e);
status StackTraverse(SqStack S);
int main()
{
SqStack S;
SElemType e;
int option;
do{
printf("1.构建空栈\n");
printf("2.清空栈\n");
printf("3.返回栈的空值\n");
printf("4.返回栈的长度\n");
printf("5.返回栈顶元素\n");
printf("6.元素入栈\n");
printf("7.元素出栈\n");
printf("8.输出栈\n");
scanf("%d",&option);
switch(option)
{
case 1:{
if(InitStack(&S)==OK)
printf("构建成功\n");
else
printf("构建失败\n");
break;
}
case 2:{
if(ClearStack(&S)==OK)
printf("已清空栈\n");
else
printf("清空失败\n");
break;
}
case 3:{
if(StackEmpty(S)==TRUE)
printf("栈为空\n");
else
printf("栈不为空\n");
break;
}
case 4:{
printf("栈的长度为:%d\n",StackLength(S));
break;
}
case 5:{
if(GetTop(S,&e)==OK)
printf("栈顶元素为:%d\n",e);
else
printf("取栈顶元素失败\n");
break;
}
case 6:{
printf("你想压入的元素:");
scanf("%d",&e);
if(Push(&S,e)==OK)
printf("压栈成功\n");
else
printf("压入失败\n");
break;
}
case 7:{
if(Pop(&S,&e)==OK)
printf("元素 %d 已出栈\n",e);
else
printf("出栈失败\n");
break;
}
case 8:{
if(StackEmpty(S)==TRUE)
printf("这是空栈\n");
else
{
if(StackTraverse(S)==OK)
printf("\n输出完成\n");
else
printf("输出失败\n");
}
break;
}
}
}while(option!=0);
DestroyStack(&S);
return 0;
}
status InitStack(SqStack *S)
{
(*S).base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!(*S).base) exit(OVERFLOW);
(*S).top=(*S).base;
(*S).stacksize=STACK_INIT_SIZE;
return OK;
}
status DestroyStack(SqStack *S)
{
SElemType *p;
while((*S).top!=(*S).base)
{
p=(*S).top--;
free(p);
}
(*S).stacksize=0;
return OK;
}
status ClearStack(SqStack *S)
{
(*S).top=(*S).base;
(*S).stacksize=STACK_INIT_SIZE;
return OK;
}
status StackEmpty(SqStack S)
{
if(S.top==S.base) return TRUE;
else
return FALSE;
}
int StackLength(SqStack S)
{
return S.top-S.base;
}
status GetTop(SqStack S,SElemType *e)
{
if(S.top==S.base) return ERROR;
*e=*(S.top-1);
return OK;
}
status Push(SqStack *S,SElemType e)
{
if((*S).top-(*S).base>=(*S).stacksize)
{
(*S).base=(SElemType *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!(*S).base) exit(OVERFLOW);
(*S).top=(*S).base+(*S).stacksize;
(*S).stacksize+=STACKINCREMENT;
}
*((*S).top++)=e;
return OK;
}
status Pop(SqStack *S,SElemType *e)
{
if((*S).top==(*S).base) return ERROR;
*e=*(--(*S).top);
return OK;
}
status StackTraverse(SqStack S)
{
if(S.top==S.base) return ERROR;
SElemType *p=S.base;
printf("\t base->top\n");
while(p!=S.top)
{
printf("\t%d",*(p++));
}
return OK;
}