[实战演练]Intel面试题目 - 进栈出栈顺序问题

电话面试中写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 }

 

posted on 2013-10-14 13:53  Horstxu  阅读(2137)  评论(0编辑  收藏  举报

导航