/*
判断某个序列是否出栈序列,比如 4 3 5 2 1,是1,2,3,4,5的出栈序列
解决方法:
使用栈数据结构,第一个栈存原始数据1,2,3,4,5,第二个栈是活动栈
第三个栈保存 4,3,5,2,1
做法是通过将原始数据栈往活动栈丢,没丢一次判断活动栈顶和第三个栈顶数据是否相同,如果相同则都弹出
当第三个栈空了时,说明成功
当第一个栈空了,依旧没能匹配到和第三个栈顶相同的元素时,说明失败
*/
#include <iostream>
#include <stack>
using namespace std;
// 栈类
class Stack
{
public:
int* _data; // 数据
int _size; // 数据大小
int _top; // 栈顶元素
// 构造函数,初始化成员变量
Stack(int size = 10) :_data(NULL), _size(size), _top(0)
{
if (_size > 0)
{
_data = new int[_size];
}
}
// 析构函数,释放内存
~Stack()
{
if (_data) delete[]_data;
}
// 弹出
void pop()
{
if (_top > 0) --_top;
}
// 压栈
void push(int data)
{
_data[_top++] = data;
}
// 获取栈顶元素
int top()
{
return _data[_top - 1];
}
// 判断栈是否为空
bool empty()
{
return _top == 0;
}
};
Stack readyToPush; // 第一个栈,保存 1,2,3,4,5数据
Stack Push; // 第二个活动栈
Stack Pop; // 第三个待判断序列
int main()
{
// 构造第一个栈
for (int i = 1; i <= 5; i++)
{
readyToPush.push(6 - i); /* push 5, 4, 3, 2, 1 to Stack */
}
// 构造第三个栈
Pop.push(1);
Pop.push(2);
Pop.push(3);
Pop.push(5);
Pop.push(4);
// 判断算法
for (;;)
{
// 将数据送一个到活动栈
if (!readyToPush.empty())
{
Push.push(readyToPush.top());
readyToPush.pop();
}
// 如果没数据可送,那么说明失败了
else
{
cout << "Error" << endl;
break;
}
// 看活动栈顶,是否等于第三个栈栈顶
if (Push.top() == Pop.top())
{
// 如果相等,则以其弹出
Push.pop();
Pop.pop();
// 如果第三个栈弹空了,说明判断结束,并且结果是对的
if (Pop.empty())
{
cout << "OK" << endl;
break;
}
}
}
system("pause");
return 0;
}
下载代码并解压后,用VC2013打开interview.sln,并设置对应的启动项目后,点击运行即可,具体步骤如下:
1)设置启动项目:右键点击解决方案,在弹出菜单中选择“设置启动项目”
2)在下拉框中选择相应项目,项目名和博客编号一致
3)点击“本地Windows调试器”运行