給定入棧序列判斷給定出棧序列是否合法
題目:輸入兩個整數序列。其中一個序列表示棧的入棧順序,判斷另一個序列有沒有可能是對應的出棧順序。
思路:用一個輔助棧,將入棧序列按照某種順序入棧,看是否可以產生出棧序列即可。
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)!)該公式: