棧的push、pop序列

棧的push、pop序列

        輸入兩個整數序列。其中一個序列表示棧的push順序,判斷另一個序列有沒有可能是對應的pop順序。爲了簡單起見,我們假設push序列的任意兩個整數都是不相等的。比如輸入的push序列是12345,那麼45321就有可能是一個pop系列。因爲可以有如下的pushpop序列:push 1push 2push 3push 4poppush 5poppoppoppop,這樣得到的pop序列就是45321。但序列43512就不可能是push序列12345pop序列。(尋找矛盾體)

分析:首先建立一個輔助棧s,遍歷pop序列中的元素p(i)。

        首先判斷輔助棧s是否爲空,如果s爲空,則在push序列中查找p(i)的位置,此時一定可以在push序列中找到p(i),然後將push序列中在該位置之前的元素全部push到輔助棧中,並且將這些元素標記爲已push,然後繼續遍歷pop序列。

    如果s不爲空,則比較棧頂元素和p(i)是否相等,如果相等則直接彈出,繼續遍歷pop序列;如果不相等則在push序列中查找p(i)的位置,如果沒有查找到,則說明不可能有這樣的pop序列,如果找到,則將push序列中在該位置之前的元素全部push到輔助棧中,並且將這些元素標記爲已push,然後繼續遍歷pop序列

代碼如下:

#include "stdafx.h"
#include "stdlib.h"
#include <iostream>
#include <string>
#include <stack>
using namespace std;

//查找元素在數組指定起始範圍內的位置
int IndexOfPushArray(int *pushArray,int start,int n,int val)
{
	for (int i=start;i<n;i++)
	{
		if (pushArray[i]==val)
			return i;
	}
	
	return -1;
}

//檢查是否可能有這樣的pop序列
bool IsPossiblePop(int *pushArray,int *popArray,int n)
{
	//index1記錄popArray[i]在pushArray中的位置,index2記錄popArray[i+1]在pushArray中的位置
	int i,j,index1=-1,index2; 
	stack<int> s; //輔助棧
	for (i=0;i<n;i++)
	{	
		//s爲空,在pushArray中查找
		if (s.empty())
		{
			index1++;
			index2=IndexOfPushArray(pushArray,index1,n,popArray[i]);
			if (index2!=-1)
			{
				for (j=index1;j<index2;j++)
				{
					s.push(pushArray[j]);
				}
				index1=index2;
			}
		}
		//s不爲空時,在pushArray中查找
		else
		{
			//棧頂元素等於popArray[i],直接彈出
			if (s.top()==popArray[i])
			{
				s.pop();
			}
			//棧頂元素不等於popArray[i],繼續在pushArray中查找
			else
			{
				index1++;
				index2=IndexOfPushArray(pushArray,index1,n,popArray[i]);
				if (index2!=-1) //查找成功
				{
					for (j=index1;j<index2;j++)
					{
						s.push(pushArray[j]);
					}
					index1=index2;
				}
				else  //未查找到
					return false;
			}
		}
	}
	
	return true;
}

void main()
{
	int  a[]={1,2,3,4,5};
	int b1[]={4,5,3,2,1};
	int b2[]={4,3,5,1,2};
	
	cout<<IsPossiblePop(a,b1,5)<<endl; //1
	cout<<IsPossiblePop(a,b2,5)<<endl; //0
}

發佈了96 篇原創文章 · 獲贊 19 · 訪問量 57萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章