题目:设一个栈的输入序列为1,2,3…n,编写算法,判断序列,p1,p2,…pn是否是合理的栈输出序列
思想:
将预期的出栈顺序用一个辅助栈保存起来,然后将元素按照入栈的顺序依次存入,若元素等于辅助栈的栈顶元素,则可以不用存入(当做出栈一样),然后考虑下一个要入栈的元素,按照这样的操作之后,等到所有元素按照原有的序列入完栈时候,最后在栈中剩下的元素的栈顶元素,和辅助栈中的栈顶元素依次比较,直至栈空,这过程中如果出现禅定元素不同的现象,则这个预期出栈顺序是不可能存在的,反之则存在。
代码展示:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MaxSize 100
/*
* 题目:设一个栈的输入序列为1,2,3…n,编写算法,判断序列,p1,p2,..pn是否是合理的栈输出序列
* */
typedef struct
{
int data[MaxSize];
int top;
}Sqstack;
void InitStack(Sqstack &S)
{
S.top = -1;
}
int StackEmpty(Sqstack S)
{
if(S.top == -1)
{
printf("栈空!");
return 1;
}
else
{
printf("栈不空!");
return 0;
}
}
void Push(Sqstack &S,int &x)
{
if(S.top==MaxSize)
{
printf("栈满,无法进栈!");
}
S.top++;
S.data[S.top] = x;
}
void Pop(Sqstack &S,int &x)
{
if(S.top==-1)
{
printf("栈空,无法出栈!");
}
x = S.data[S.top--];
}
int GetTop(Sqstack S,int &x)
{
if(S.top==-1)
{
printf("栈空,无法获取栈顶元素!");
return 0;
}
x = S.data[S.top];
return 1;
}
void Print(Sqstack S)
{
while(S.top>=0)
{
printf("%d ",S.data[S.top--]);
}
printf("\n");
}
void Dispose()
{
Sqstack S,Q;
InitStack(S);
InitStack(Q);
printf("请输入栈中的元素个数:");
int n;
scanf("%d",&n);
printf("请输入预期的出栈顺序:");
int data1;
for(int i=0; i<n; i++)
{
scanf("%d",&data1);
Push(Q,data1);
}
int data2;
int temp;
printf("请输入依次入栈中的元素顺序:");
while(n>0)
{
scanf("%d",&data2);
GetTop(Q,temp);
if(data2!=temp)
{
Push(S,data2);
}
else
{
Pop(Q,temp);
}
n--;
}
int topS,topQ,x,flag = 1;
while(StackEmpty(Q)!=1 && StackEmpty(S)!=1)
{
GetTop(Q,topQ);
GetTop(S,topS);
if(topQ==topS)
{
Pop(S,x);
Pop(Q,x);
}
else
{
flag = 0;
break;
}
}
if(flag)
{
printf("\n预期出栈顺序存在!");
}
else
{
printf("\n预期出栈顺序不可能存在!");
}
}
int main() {
Dispose();
return 0;
}