题目描述:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
题目解析:
首先理解题意:压栈和出栈可以交替进行。为了便于分析,书中推荐举例子的方法,便于我们思考问题。我们设两个数列inbuf和outbuf。当现在要比较的outbuf[i]在栈顶的时候,我们就弹出该数据,接着比较outbuf[i+1];如果和栈顶元素不相等,则一边入栈一边比较。不过我用的方法是:当和栈顶元素不相等时,和要入栈的元素相比,如果相等了就不入栈了,直接比较下面的数据。我写的代码有重复的地方,还是应该先总结各种可能情况,再下手写代码比较好。这样结构更合理。
另一种方案:
在和出栈的元素比较前,先入栈,这样实现起来比较简单。如果所有元素都入栈了,那么出栈序列和栈顶元素比较,一旦发现不相等了,就返回错误。
bool Judge(int inbuf[],int outbuf[],int length)
{
if(inbuf == NULL || outbuf == NULL || length <= 0)
return false;
int i,j=0;
stack<int> S;
for(i = 0;i < length;i++){
S.push(inbuf[i]); //先入栈,再和出栈序列判断
if(outbuf[j] == S.top()){
j++;
S.pop();
}
}
while(j < length){
if(outbuf[j] != S.top())
break;
S.pop();
j++;
}
if(j < length)
return false;
return true;
}
完整代码如下:
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
int g_Flag = FALSE;
typedef struct StackNode{
int *base;
int *top;
}StackNode;
int Judge(int inbuf[],int outbuf[],int iBegin,int oBegin,int n,StackNode *S);
void InitStack(StackNode *S,int n);
int Push(StackNode *S,int e);
int Pop(StackNode *S,int *e);
int GetTop(StackNode *S,int *e);
void DestoryStack(StackNode *S);
int main(void)
{
int *inbuf;
int *outbuf;
int n;
char ch;
StackNode S;
printf("input the how many numbers you want to input:");
scanf("%d",&n);
inbuf = (int *)malloc(n * sizeof(int));
outbuf = (int *)malloc(n * sizeof(int));
printf("input the inbuf:");
for(int i = 0;i < n;++i)
scanf("%d",&inbuf[i]);
while(getchar() != '\n')
;
printf("input a to continue:");
while((ch = getchar()) == 'a'){
printf("input the outbuf:");
for(int i = 0;i < n;++i)
scanf("%d",&outbuf[i]);
InitStack(&S,n);
int result = Judge(inbuf,outbuf,0,0,n,&S);
if(result)
printf("TRUE!\n");
else
printf("FALSE\n");
DestoryStack(&S);
while(getchar() != '\n')
;
printf("input a to continue:");
}
return 0;
}
void InitStack(StackNode *S,int n)
{
S->base = (int *)malloc(n * sizeof(int));
if(!(S->base))
exit(-1);
S->top = S->base;
}
void DestoryStack(StackNode *S)
{
free(S->base);
S->top = S->base = NULL;
}
int Push(StackNode *S,int e)
{
*(S->top) = e;
++S->top;
return 1;
}
int Pop(StackNode *S,int *e)
{
if(S->base == S->top)
return 0;
*e = *(--S->top);
return 1;
}
int GetTop(StackNode *S,int *e)
{
if(S->base == S->top)
return 0;
*e = *(S->top - 1);
return 1;
}
int Judge(int inbuf[],int outbuf[],int iBegin,int oBegin,int n,StackNode *S)
{
int e;
if(oBegin >= n)
return 1;
if(iBegin < n){ //证明inbuf数组中还有数据
if(GetTop(S,&e) && e == outbuf[oBegin]){ //如果栈中有数据,且和outbuf值相等,出栈!
Pop(S,&e);
oBegin++;
}else if(inbuf[iBegin] == outbuf[oBegin]){ //如果数组中的数据相等了,索引都增加1
++iBegin;
++oBegin;
}else{ //如果都不相等,则向堆栈放入数据
Push(S,inbuf[iBegin]);
++iBegin;
}
}else{ //如果inbuf中没有数据了,一旦栈顶和要出栈的数据不相等就报错!
if(GetTop(S,&e) && e == outbuf[oBegin]){
Pop(S,&e);
++oBegin;
}else
return 0;
}
int flag = Judge(inbuf,outbuf,iBegin,oBegin,n,S);
if(flag)
return 1;
else
return 0;
}