顺序栈:栈是一种特殊的线性表,栈的入栈和出栈只能在指定的一段进行,因而产生了先进先出,后进后出的结果。顺序栈是栈的顺序映像的实现。
通过此程序可以实现顺序栈初始化,顺序栈入栈,顺序栈出栈,判断顺序栈是否为空,求顺序栈长度,顺序栈输出。
代码如下
#include<stdio.h>
#include<malloc.h>
#include<process.h>
#define STACK_INIT_SIZE 10
#define STACKINCREMENT 5
#define MAXSIZE 100
#define OK 1
#define Error 0
int yes=0;
typedef char QElemType;
typedef struct
{
char *base;
char *top;
int stacksize;
}SeqStack;
void InitStack(SeqStack *S)
{
S->base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
if(!S->base)exit(1);
S->top=S->base;
S->stacksize=STACK_INIT_SIZE;
}
void CreatSeqStack(SeqStack *Q)
{
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')
*Q->top++=ch;
}
yes=1;
}
int push(SeqStack *S,char e)
{
if(S->top-S->base>S->stacksize)
{
S->base=(char *)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(char));
if(!S->base)
exit(1);
S->top=S->base+S->stacksize;
S->stacksize+=STACKINCREMENT;
}
*S->top++=e;
return 1;
}
char pop(SeqStack *S,char *e)
{
if(S->top==S->base)
printf("error!");
*e=*--S->top;
return *e;
}
int StackEmpty(SeqStack *S)
{
if(S->top==S->base)
return 0;
else
return 1;
}
int SeqLength(SeqStack *S)
{
int length;
length=(S->top-S->base);
return length;
}
void DispSeqStack(SeqStack *S)
{
char *p,*q,e;
p=S->top;
q=S->base;
printf("此事顺序栈中的元素是:\n");
while(p!=q)
{
e=*(--p);
printf("%3c",e);
}
printf("\n");
}
void DestroyStack(SeqStack *S)
{
free(S->base);
printf("顺序栈已被销毁!\n");
}
char GetTop(SeqStack *S,char e)
{
if(S->top==S->base)
return -1;
e=*(S->top-1);
return e;
}
int Seqstackempty(SeqStack *q)
{
if(q->top==q->base)
return 1;
else
return 0;
}
void Conversion()
{
int n,m;
SeqStack s;
QElemType e;
InitStack(&s);
printf("请输入需转化的数值:\n");
scanf("%d",&n);
printf("请输入目标数制:\n");
scanf("%d",&m);
while(n)
{
push(&s,n%m);
n=n/m;
}
while(StackEmpty(&s))
{
pop(&s,&e);
printf("%d",e);
DestroyStack(&s);
}
}
void menu()
{
printf("\t顺序栈基本操作实验\t\t\t\n");
printf("*********************************\n");
printf("*请选择命令序号(0-8):\t\t*\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("*8 顺序栈应用:\t\t\t*\n");
printf("*0 程序结束:\t\t\t*\n");
printf("*********************************\n");
}
void fun()
{
SeqStack ptr;
int sel;
char ch;
InitStack(&ptr);
while(1)
{
menu();
scanf("%d",&sel);
switch(sel)
{
case 1:
if(yes==1)
{
printf("此时顺序栈已创建,不能重复创建!\n");
break;
}
else
CreatSeqStack(&ptr);
break;
case 2:
if(yes==0)
{
printf("此时顺序栈未创建,不能入栈!\n");
break;
}
else
{
printf("请输入栈的元素值:\n");
scanf("%c",&ch);
if(getchar()!='\n')
push(&ptr,ch);
break;
}
case 3:
if(yes==0)
{
printf("此时顺序栈未创建,不能出栈!\n");
break;
}
else
{
if(ptr.top==ptr.base)
printf("队列已空!\n");
else
{
ch=pop(&ptr,&ch);
printf("目前出栈的元素:%c.\n",ch);
break;
}
}
case 4:
if(yes==0)
{
printf("此时顺序栈未创建,不能求顺序栈长度!\n");
break;
}
else
{
printf("顺序栈的长度是%d:",SeqLength(&ptr));
break;
}
case 5:
if(yes==0)
{
printf("此时顺序栈未创建!不能判断是否为空\n");
break;
}
else if(Seqstackempty(&ptr))
printf("当前顺序栈为空栈!\n");
else
printf("当前顺序栈为非栈!\n");
break;
case 6:
if(yes==0)
{
printf("此时顺序栈尚未创建,不能输出!\n");
break;
}
else
{
DispSeqStack(&ptr);
break;
}
case 7:
if(yes==0)
{
printf("此时顺序栈尚未创建,不能销毁!\n");
break;
}
else
{
DestroyStack(&ptr);
break;
}
case 8:
Conversion();
break;
case 0:
exit(1);
break;
default:
printf("输入命令错误,请重新输入!\n");
break;
}
}
}
int main(void)
{
fun();
return OK;
}