在主函数中编写菜单(基本的1.入栈;2.出栈;3.逆置;4.退出)调试运行程序。
#include<stdio.h>
#include<stdlib.h>
#define StackMaxsize 50
#define QueueMaxsize 50
typedef struct SqStack
{
int data[StackMaxsize];
int top;
}SqStack;
typedef struct SqQueue
{
int data[QueueMaxsize];
int front;
int rear;
}SqQueue;
void InitStack(SqStack *S);//栈的初始化
void Push(SqStack *S,int data);//入栈
int Pop(SqStack *S);//出栈
void StackTraverse(SqStack *S);//打印栈中的元素
void InitQueue(SqQueue *Q);//队的初始化
void EnQueue(SqQueue *Q,int data);//入队
int DeQueue(SqQueue *Q);//出队
void nizhiStack(SqStack *S,SqQueue *Q);//栈的逆置
void main()//主函数
{
int data,choose,n,i;
SqStack S1;
SqStack *S=&S1;
SqQueue Q1;
SqQueue *Q=&Q1;
InitStack(S);
for(;;)
{
printf("有以下几项选择:\n");
printf("0.退出 1.入栈 2.出栈 3.将栈逆置 4.从栈底到栈顶打印栈内元素\n");
printf("请输入您的选择:");
scanf("%d",&choose);
switch(choose)
{
case 0:exit(0);
case 1:
{
if(StackMaxsize-S->top<=0)
printf("栈满,无法入栈!\n");
else
{
printf("请输入要入栈的个数(栈满的值为50):");
scanf("%d",&n);
printf("请输入要入栈的元素:");
for(i=0;i<n;i++)
{
scanf("%d",&data);
Push(S,data);
StackTraverse(S);
}
printf("入栈成功!\n");
}
break;
}
case 2:
{
if(S->top==0)
printf("栈空,无法出栈!\n");
else
{
data=Pop(S);
printf("出栈成功,出栈的元素为:%d\n",data);
StackTraverse(S);
}
break;
}
case 3:
{
if(S->top==0)
printf("栈空,无法逆置!\n");
else
{
nizhiStack(S,Q);
StackTraverse(S);
}
break;
}
case 4:StackTraverse(S);break;
default:printf("输入数字无效!\n");
}
}
}
void InitStack(SqStack *S)
{
S->top=0;
}
void Push(SqStack *S,int data)
{
if((StackMaxsize-S->top>=0))
{
S->data[++S->top]=data;
}
else
printf("栈满!\n");
}
int Pop(SqStack *S)
{
int data;
if(S->top==0)
printf("栈空!\n");
else
{
data=S->data[S->top--];
return data;
}
}
void StackTraverse(SqStack *S)//打印
{
int i;
if(S->top==0)
printf("栈空!\n");
else if((StackMaxsize-S->top<0))
{
printf("栈满,无法入栈!\n");
}
else
{
printf("从栈底到栈顶的元素依次为:");
for(i=1;i<=S->top;i++)
{
printf("%d ",S->data[i]);
}
printf("\n");
}
}
void InitQueue(SqQueue *Q)
{
Q->front=Q->rear=0;
}
void EnQueue(SqQueue *Q,int data)
{
if((Q->rear+1)%QueueMaxsize==Q->front)
{
printf("队满,无法入队!\n");
}
else
{
Q->data[Q->rear]=data;
Q->rear=(Q->rear+1)%QueueMaxsize;
}
}
int DeQueue(SqQueue *Q)
{
int data;
if(Q->front==Q->rear)
printf("队空,无法出队!\n");
else
{
data=Q->data[Q->front];
Q->front=(Q->front+1)%QueueMaxsize;
return data;
}
}
void nizhiStack(SqStack *S,SqQueue *Q)
{
int i;
InitQueue(Q);
for(i=S->top;i>0;i--)
{
EnQueue(Q,Pop(S));
}
for(i=Q->front;i%QueueMaxsize!=Q->rear;i++)
{
Push(S,DeQueue(Q));
}
printf("逆置栈内元素成功!\n");
}
实例
1)入栈,输入入栈的元素的个数;程序自动打印出栈中的元素。
2)逆栈