Train Problem——判断输出序列是否是输入序列的出栈顺序

http://acm.hdu.edu.cn/showproblem.php?pid=1022

 

 

#include <iostream> #include <stack> using namespace std; void TestIsStackSequence(char *in, char *out); int main() { int n; char in[10]; char out[10]; while (scanf("%d %s %s", &n, in, out) != EOF) { TestIsStackSequence(in, out); } return 0; } /************************************************************************/ /* 思路:遍历输入序列in的每一个元素,并将其插入到栈s中,并且比较栈顶元素与输出序列第j位置的元素, 若相等栈顶元素出栈,j++, 若栈为空,跳出循环,进行下次遍历。 /************************************************************************/ //参数in为输出的序列,out为输出的序列 void TestIsStackSequence(char *in, char *out) { int len_in = strlen(in); int len_out = strlen(out); int *inOrder = new int[len_in]; int *outOrder = new int[len_out]; int *arr = new int[len_in * 2]; //存放是入栈还是出栈的标识(1:表示入栈,0:表示出栈) int i, j, k; for (i=0; i<len_in; i++) //将字符串转换成int数字,其实没必要的 { inOrder[i] = in[i] - '0'; outOrder[i] = out[i] - '0'; } stack<int> s; i = j = k = 0; while(i < len_in) //遍历输入序列 { s.push(inOrder[i++]); arr[k++] = 1;//表示入栈 while (s.top() == outOrder[j]) //入栈顶元素与输出序列第j位置的元素相同,进行弹出操作 { s.pop(); arr[k++] = 0; //表示出栈 j++; if (s.empty()) //如栈为空,跳出当前循环进行下次 { break; } } } if (!s.empty()) //若非空,失败 { cout<<"No./nFINISH"<<endl; } else //成功 { cout<<"Yes."<<endl; for (i=0; i<len_in * 2; ++i) { if (arr[i] == 1) { cout<<"in"<<endl; } else { cout<<"out"<<endl; } } cout<<"FINISH"<<endl; } }  

 

 

你可能感兴趣的:(Train Problem——判断输出序列是否是输入序列的出栈顺序)