1. 程式人生 > >給定入棧序列判斷給定出棧序列是否合法

給定入棧序列判斷給定出棧序列是否合法

題目:輸入兩個整數序列。其中一個序列表示棧的入棧順序,判斷另一個序列有沒有可能是對應的出棧順序。
思路
:用一個輔助棧,將入棧序列按照某種順序入棧,看是否可以產生出棧序列即可。

1)如果當前棧為空,且入棧序列不空,則入棧序列的下一個元素入棧;

2)如果當前輔助棧的棧頂元素不等於出棧序列的首元素,那麼入棧序列一直入棧,直到入棧序列為空。

3)如果當前輔助棧的棧頂元素等於出棧序列的首元素,那麼棧頂元素彈出,出棧序列第一個元素移走;

4) 如果入棧序列為空,出棧序列第一個元素仍然不等於棧頂元素,則表示2個序列是不匹配的。

舉例

棧的特點是後進先出,假設入棧的順序是  1 2 3 4 5,出棧的順序是:4 5 3 2 1,這樣操作的順序是:push 1, push 2,push 3,push 4,pop 4, push 5 , pop 5,pop 3, pop 2, pop 1。假設出棧的順序是4 5 3 1 2,這種順序是錯誤的,因為1比2先壓入棧,所以2的出棧順序應該是1之前,顯然出棧順序是錯誤的。下面使用程式進行驗證

程式碼如下:

#include <iostream>
#include <stack>
#include <cstring>
using namespace std;


//給定入棧序列判斷出棧序列是否合法,stkIn表示入棧序列,stkOut表示出棧序列
bool JudgeIsLegal(char *stkIn, char *stkOut)
{
	stack<char> midStk;//判斷過程中藉助的中間輔助棧

	if(strlen(stkIn) != strlen(stkOut)){//若入棧與出棧的元素個數不同的話,直接返回false
		return false;
	}

	midStk.push(*stkIn++);//入棧序列的第一個元入棧

	while(*stkOut != '\0'){//如果出棧序列沒有匹配完

		if(midStk.empty() && *stkIn!='\0')//若輔助棧已空說明目前出棧和入棧序列是匹配的,如果入棧序列不為空,繼續入棧  
			midStk.push(*stkIn++);

		//如果輔助棧的棧頂元素和出棧序列第一個元素不一致,那麼就將入棧序列繼續入棧  
		while(*stkOut != midStk.top() && *stkIn != '\0'){
			midStk.push(*stkIn++);
		}

		//如果棧頂元素和出棧序列第一個元素一致,那麼就將棧頂元素出棧,並且匹配出棧序列下一個元素  
		if(*stkOut == midStk.top()){
			stkOut++;
			midStk.pop();
			continue;
		}
		//如果入棧序列已為空,但是棧頂元素和出棧序列第一個元素扔不一致,則說明這2個串不是匹配的。  
		if(*stkIn == '\0' && midStk.top() != *stkOut){
			return false;
		}
	}

	return true;
}

int main()
{
	char *str ="12345";  
	char *str2 = "45312";  

	if (JudgeIsLegal(str,str2))
	{
		cout<<"該出棧序列合法!"<<endl;
	}else{
		cout<<"該出棧序列非法!"<<endl;
	}

	return 0;
}

執行結果



相關推薦

給定序列判斷給定序列是否合法

題目:輸入兩個整數序列。其中一個序列表示棧的入棧順序,判斷另一個序列有沒有可能是對應的出棧順序。思路:用一個輔助棧,將入棧序列按照某種順序入棧,看是否可以產生出棧序列即可。 1)如果當前棧為空,且入棧

給定序列判斷給定序列是否合法(Exercise1_3_45,java)

package chapterone; import java.util.Scanner; import java.util.Stack; /*** * @author luodijack *

一個序列和一個序列判斷序列是否是序列對應的序列

注意:在入棧的過程中,並不是所有元素都入棧了之後才出棧,也可能是入棧幾個元素,出棧一個或多個,然後再繼續入棧,入棧序列只能保證所有元素按規定順序入棧。 思路:利用一個輔助棧和一個指向出棧序列第一個元素的下標(int count = 0;),利用一個迴圈在遍歷入棧序列入棧的同

判斷是否的順序滿足順序-Java

傳入兩個陣列,一個代表入棧順序,一個代表出站順序,返回一個boolean值表示這個出棧順序是否滿足入棧順序。 比如: 傳入: 12345 43512 返回: false 按理來說這是一道非常簡單的題,但是我還是用了至少半個

和佇列的面試題(五)---判斷元素順序的合法性

題目: 如:入棧的序列(1,2,3,4,5),出棧序列為 (4,5,3,2,1)是合法序列, 入棧的序列(1,2,3,4,5),出棧序列為(1,5,3,2,4)是不合法序列 一:判斷元素出

的基本操作

article 安全 empty scan -s type fine mod pos #include<stdio.h> #include<stdlib.h> #define LENGTH 100 //初始分配棧的長度 #define ADD

php的定義和的實現

棧是線性表的一種,他的特點是後入先出,可以這麼理解,棧就像一個存東西的盒子,先放進去的在最底層,後放進去的在上層,因為上層的東西把底層的東西壓住了,下層的想要出去就必須把上層的先拿開才行。 定義:棧是限制插入和刪除都只能發生在一個位置上進行的線性表,該位置是線性表的末端,叫做棧的頂。 口訣:“後進先出”,

【資料結構】實現一個要求實現Push()Pop()Min(返回最小值)的時間 複雜度為O(1)

文章目錄 思路 MinStack.h MinStack.c Test.c 棧的基本實現: https://blog.csdn.net/weixin_41892460/article/details/8297385

n個元素進,輸出所有序列-卡特蘭數-遞迴

#include <iostream> #include <stack> #include <queue> #include <algorithm> #include <string.h> #include <

[差分序列] 判斷的牌能否只順子完 101775L SOS

J. Straight Master time limit per test 2.0 s memory limit per test 256 MB input standard input output standard output A straight is

判斷給定序列是否是對應序列序列(C++)

題目: 輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。 (假設壓入棧的所有數字均不相等) 如 序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓

已知一個序列判斷給定的一個序列是否為其序列

思路:(1)棧為後入先出序列(2)將入棧序列的元素一個一個入棧然後和出序列中每個元素比較。取序列第一個元素時,把第一個序列的各個元素依次入棧,然後入棧一個後和序列元素比較,如果相同那麼將這個元素出棧,並

給定一個序列判斷序列是否是對應輸入序列序列問題

n) 建立 args scanner stack exti ati 壓入 以及 最近在刷劍指offer的題目,有問題描述如下: 輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,

給定順序,判斷順序是否合法

給定一個入棧順序,判斷出棧順序是否有可能發生,所遵循的方法是使用一個輔助棧記錄入棧的元素,當剛開始時候輔助棧為空,入棧元素第一個壓入輔助棧,接下來如果看出棧順序,如果出棧順序的第一個元素和輔助棧的棧頂元素不相等,則繼續把 入棧元素的下一個壓入輔助棧;如果出棧順序

【100題】給定序列判斷一個序列是否可能為輸出序列

#include <stack> #include <iostream> using namespace std; /* 假設序列中無重複數字 輸入序列為: 1,2,3,4,5 測試序列:4,5,3,2,1 測試序列:4,3,5,1,2 題目拓展

給定序列1到n,輸出所有可能的序列

package com.test; import java.util.Stack; public class StackSequence { public static int number=0; static Stack<Integer> st

輸入兩個整數序列,第一個序列表示的壓順序,請判斷第二個序列是否為該的彈順序

ack pan back 表示 return i++ ++ 輸入 gpo 1 class Solution{ 2 public: 3 bool IsPopOrder(vector<int> pushV,vector<int> popV){

給定順序,輸出所有可能情況及所有情況的總數

一個長度為n的無重複序列入棧的所有出棧方式 例如1、2、3這三個數字,入棧並出棧共有5種方式,分別為:321、312、231、213、123。那麼對於長度為n的無重複序列中所有的出棧方式有哪些呢? 為了設計計算的演算法,我們可以用佇列(queue)來模擬輸入,佇列的輸出則按照原先序列的順序。

給定順序,求所有可能的順序

先給出算所有出棧可能的個數的公式,由卡特蘭數可以得到 n = (2n!)/(n! * (n+1)!) 那麼怎麼樣得到所有的具體出棧順序呢,有兩種思路可以解決這個問題。 1.先得到入棧字串的全排列,然後根據出棧順序的規律進行篩選。 那麼篩選的條件是什麼? 舉例說明 入棧

關於給定順序,求所有可能的順序的討論

最近學習資料結構,關於給定入棧順序,求所有可能的出棧順序的問題有些迷惑(現在也是),於是搜尋了一些相關的材料。我覺得可能是因為目前我沒有理解問題而無法得出答案。詳情見下。先給出算所有出棧可能的個數的公式,由卡特蘭數可以得到n = (2n!)/(n! * (n+1)!)該公式: