出栈入栈合理性,用两指针指向两数组,创建一新栈来存储元素。对于入栈数组的指针一直往下走,并入栈,当与出栈数组元素相等时,让栈中的元素pop,还原入栈出栈的过程。如果在这种情况下不处理的话,会导致入栈数组元素一直往下走,若入栈较多元素后连续出栈,会导致判断失误(入栈元素一直往后走,而之前早入栈的元素会没有处理到)。可以让出栈元素往后走并与栈顶元素比较(用栈的size来做循环条件)
stack.h
#include<iostream>
#include<stack>
using namespace std;
template<typename T>
class Stack
{
public:
Stack()
{}
bool Islegal(T* in, T* out, size_t sz)// 判断入栈合法性
{
while (sz--)
{
s.push(*in);
if (*in == *out)//判断出栈元素与入栈元素是否相等
{
while (s.size() > 0)//防止两个相邻元素相继出栈
{
if (s.top() == *out)//当栈顶元素与出栈元素相等,则pop
{
s.pop();
}
else
break;
out++; //只有入栈元素与出栈元素相等时,出栈元素后移
}
}
in++;
}
return true;
}
private:
stack<T> s;
};
test.c
#include"stack.h"
void test4()
{
Stack<int> s;
int a[] = { 1,2,3,4,5 };
int b[] = { 1, 3, 2, 5, 4 };//1 3 5 4 2
cout<<s.Islegal(a, b, sizeof(a)/sizeof(a[0]));
}
int main()
{
test4();
getchar();
return 0;
}