出栈顺序
參考: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;}
總結
- 上一篇: linux---socket编程
- 下一篇: 友元函数友元类