日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

出栈顺序

發布時間:2024/9/30 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 出栈顺序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考:http://www.cnblogs.com/MichaelYin/archive/2011/10/10/2206532.html

比如現在又1 2 3 4 5五個數字,規定這五個數字入棧的順序不變,但是中間可以任意的出棧,出棧的數字就當做輸出,請寫出程序輸出所有的出棧的序列

這個問題可以用很經典的回溯法來解,就是通過遞歸方法調用,在每一層找出所有可能的操作方式,直到全部輸出,另外需要加一句的是在以前我是不知道遞歸的時候還原現場的,在這個代碼里面也是學到了這個知識點,而這個小細節其實是很重要的,當時就是因為這個細節讓我在思考遞歸調用的時候否定了該方法,后來想了許久才重新相通

下面貼出相關代碼

public static void SearchStack(Stack<int> input, Stack<int> stack, Stack<int> output) {if (input.Count == 0 && stack.Count == 0){//輸出結果Array array = output.ToArray();foreach (int obj in array)Console.Write(obj);Console.WriteLine("");}else{if (input.Count > 0){//入棧stack.Push(input.Pop());SearchStack(input, stack, output);input.Push(stack.Pop());}if (stack.Count > 0){//出棧output.Push(stack.Pop());SearchStack(input, stack, output);stack.Push(output.Pop());}} }
題目:輸入兩個整數序列。其中一個序列表示棧的push順序,?
判斷另一個序列有沒有可能是對應的pop順序。?

1、每個已出棧之后的數且小于此數的數都必須按降序排列。復雜度O(n^2),這個要求輸入的序列必須是升序的

2.以模擬一個棧,然后通過棧頂得元素和輸入序列進行比較,如果沒有的,則往前繼續入棧,知道找到出棧的那個數字為止,如果中間沒有找到,且棧中還有元素,則查找失敗

public static bool CheckStack(int[] input, int[] output, int length) {int indexOfInput, indexOfOutput;indexOfInput = 0;indexOfOutput = 0;System.Collections.Generic.Stack<int> stack = new Stack<int>();//初始化while (input[indexOfInput] != output[0]){stack.Push(input[indexOfInput]);indexOfInput++;}//入棧stack.Push(input[indexOfInput]);indexOfInput++;//checkwhile (indexOfOutput < length){if (stack.Count != 0 && stack.Peek() == output[indexOfOutput]){//棧有元素相等,popstack.Pop();indexOfOutput++;}else{if (indexOfInput < length){//入棧stack.Push(input[indexOfInput]);indexOfInput++;}else{return false;}}}return true; }
我的代碼更簡潔


bool isStack(const char *a,const char *b) {if(strlen(a)!=strlen(b))return false;if(a==NULL ||b==NULL)return false;vector<char> sk(strlen(a));int psk=0;while (*b!='\0'){if(psk==0 || sk[psk-1]!=*b){if(*a=='\0')return false;sk[psk++] = *a++;}else{--psk;++b;}}return true;}int main() {cout<<isStack("12345","43512");return 0;}




總結

以上是生活随笔為你收集整理的出栈顺序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。