电话面试中写C++,逻辑比较清楚的一个题目,一紧张就不能好好地写下来,漏洞百出。以前经常在完善的编译环境中写代码,换了一个白板子上写反而写的不通顺了,犯了一些基础错误,比如stack中的首个元素是top方法,判断是否为空为empty方法,方法名字写错了……以后看来还是要勤加练习才好。废话不多说,直接看题目了。
题目:两个数组,长度相同,都为n,两个数组分别为inseq和outseq,求出如果以inseq为入栈顺序,那么outseq可不可能是它的一个出栈顺序,可能则返回true
样例:
inseq = {1,2,3,4,5} outseq={5,4,3,2,1} 返回true;
inseq = {1,2,3,4,5} outseq={4,3,2,1,5},返回true;
inseq = {1,2,3,4,5} outseq={2,3,5,1,4},返回false。
解题思路:模拟整个过程,挨个把inseq的数据放入栈中。直到栈顶元素和出栈序列outseq所指的元素相同,则一直出栈,并将outseq指针后移,直到栈顶元素和outseq指针所指的元素不一样了,则又开始进栈。每次循环中,要么进栈,要么出栈,总要有一个动作在执行,如果既没出栈也没进栈,一定出了什么问题,直接跳出循环,最后进行判断。代码如下:
1 #include <iostream> 2 #include <stack> 3 using namespace std; 4 5 bool islegal(int *inseq, int *outseq, int n){ 6 if(n==0) return true; 7 if(n==1) return inseq[0]==outseq[0]; 8 stack<int> st; 9 10 int i=0,j=0; 11 12 bool flag = false; //用于确定每一个最外层while循环中有操作在执行,没有操作可以执行,则必然有违反的情况 13 while(j<n){ 14 if((st.empty() || (st.top()!= outseq[j])) && i<n){//如果栈为空或者第一个元素不等于出栈序列第一个元素,且i<n,则进栈 15 st.push(inseq[i]); 16 i++; 17 flag = true; 18 } 19 if(!st.empty() && st.top()== outseq[j] ){//如果栈不为空,并且第一个元素等于出栈序列第一个元素,则出栈 20 st.pop(); 21 j++; 22 flag = true; 23 } 24 if (!flag) 25 break; 26 else 27 flag = false; 28 } 29 if(st.empty() && j==n && i==n) 30 return true; 31 32 return false; 33 } 34 35 int main(){ 36 int a[] = {1,2,3,4,5}; 37 int b[] = {4,3,5,2,1}; 38 cout<<islegal(a,b,5); 39 system("pause"); 40 return 0; 41 }