JSMS30-栈的顺序问题-剑指offer22

124 阅读1分钟

题目描述:给定一个入栈顺序和一个出栈顺序,判断出栈和进栈是否为同一个栈。

解析,这道题说难也有点难,说不难也不难,难的地方在于代码的实现,不难的地方在于这道题实际上很容易想到解法,也就是创建一个栈Tmp,按照进栈顺序进栈,如果出栈顺序的当前值等于进栈的值则出栈,然后依次循环,直到最后出栈顺序为空,则出栈顺序和进栈顺序为同一个栈。

#include <stdio.h>
#include <stdlib.h>

#define max 10
typedef struct d{
	
	int data[max];
	int top; 
}stack;


bool isPopOrder(int *pushA,int *popA,int len)
{
	bool ret=false;
	if(len>0)
	{
		int *pNextPush=pushA;
		int *pNextPop=popA;
		stack *s=(stack *)malloc(sizeof(stack));
		s->top=-1;
		 
		for(;pNextPop-popA<len;)
		{
			for(;s->top==-1||s->data[s->top]!=*pNextPop;)
			{
				printf("I am here");
				if(pNextPush-pushA==len)
				{
					break;
				}
				s->data[++s->top]=*pNextPush;
				pNextPush++;
			} 
			if(s->data[s->top]!=*pNextPop)
			{
				break;
			}
			s->data[s->top--];
			pNextPop++;
		}
		if(s->top==-1&&(pNextPop-popA==len))
		{
			ret=true;
		}
	}
	return ret;
}


int main()
{
	int pushArr[]={1,2,3,4,5};	
	int popArr[]={4,5,3,2,1};
	int len=sizeof(pushArr)/sizeof(pushArr[0]);
	bool ret=isPopOrder(pushArr,popArr,len); 
	printf("%d\n",ret);
}