内容:
假设以P和O(大写字母O)表示入栈和出栈操作,根据一个P和O的序列,对一个空堆栈进行操作,当进行操作结束后,堆栈为空,则该序列是合法的,否则为非法的(包括栈满操作没完成,栈空操作没完成,操作完成但堆栈为空)。当判断为P时,输入入栈元素并入栈,当判断为O时输出栈顶元素并出栈。入栈元素类型设为int型。
代码:
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#define MAXSIZE 10
typedef struct
{
int num[MAXSIZE];//存储数字
int top; //指向num栈顶
} SqStack, *Sq;
void Display(Sq S) // 显示函数,输出栈中元素
{
if(S->top== -1)
{
printf("栈为空");
}
else
{
printf("栈中元素是:");
while(S->top != -1)
{
printf("%d ",S->num[S->top]);
S->top--;
}
}
}
int Push(Sq S )//数字入栈
{ int flag=1;
if(S->top == MAXSIZE-1) // 栈满
{
flag = 0;
}
else
{
S->top++;
printf("输入入栈数字:");
scanf("%d",&S->num[S->top]);
flag = 1;
}
return flag;
}
int Pop(Sq S)//数字出栈
{
int flag = 1;
if(S->top == -1)
{
flag = 0;
}
else
{
printf("输出出栈元素:%d",S->num[S->top]);
printf("\n");
S->top--;
flag = 1;
}
return flag;
}
int main()
{
Sq S=(SqStack *)malloc(sizeof(SqStack));
S->top = -1; //初始化栈
int flag = 1; //标志变量
int l; // 储存Po序列长度
char PO[MAXSIZE]; //Po序列数组
printf("输入PO序列:");
gets(PO);
l=strlen(PO); //计算PO序列长度
for(int j=0; j<l; j++) //根据PO序列 ,P为数字入栈,O为数字出栈
{
if(PO[j]=='P')
flag = Push(S);
else if(PO[j]=='O')
flag = Pop(S);
else if(flag == 0) // if(flag == 0)跳出循环
break;
}
if(flag==1 && S->top==-1) //各步执行合法 即Push(S), Pop(S),执行完毕后栈为空!
printf("合法!");
else //若PO序列 执行后不合法,输出栈中剩余元素
{
printf("非法!\n");
Display(S);
}
return 0;
}