【思路】
给出入栈顺序,判断出栈顺序的合法性。
大致算法如下:
以入栈顺序 1 2 3 4 5,出栈顺序2 1 3 5 4 为例
1.先判断p1 p2不相等,1入栈,p1++然后p1和p2相等,p1++,p2++;
2.判断栈顶元素1和p2相等,则出栈且p2++;
3.p1的值和p2相等,都为三,则p1++,p2++;
4.s为空,p2->5和p1->4不相等,则4入栈,p1++;
5.此时p1->5,p2->5,s->4,p1==p2,则p2++到4,p1到头,则将s栈里的元素拿出与p2比较,相等,出栈。
6.p2到了结尾,p1也到了结尾,s栈为空,则这个序列是正确的。
【代码如下】
bool Judge(int *p1,int *p2,int len1,int len2) { if ( (!p1)||(!p2)||(len1 != len2)) //如果p1 p2长度不同或者为空,直接返回 { return false; } stack<int> s; int i = 0;//p1 int j = 0;//p2 while (j < len2) { if (!s.empty() && s.top() == p2[j]) //s不为空,且s栈顶与p2相等 { s.pop(); //s出栈,p2++ j++; } else //s为空或者s不为空但是栈顶和p2不等时,都要比较p1和p2的值 { if (p1[i] == p2[j]) //如果相等 { ++i; ++j; } else //如果不等 { s.push(p1[i]); ++i; } if (i > len1) //防止p1越界,但是有不能让它到了尽头就退出,应该过了最后一个再退出 break; } } if (s.empty()) return true; return false; }