基于visual Studio2013解决面试题之0409判断一个栈是否另外一个栈的弹出序列_数据


题目

基于visual Studio2013解决面试题之0409判断一个栈是否另外一个栈的弹出序列_原始数据_02


解决代码及点评
/*
判断某个序列是否出栈序列,比如 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)设置启动项目:右键点击解决方案,在弹出菜单中选择“设置启动项目”

基于visual Studio2013解决面试题之0409判断一个栈是否另外一个栈的弹出序列_数据_03

2)在下拉框中选择相应项目,项目名和博客编号一致

基于visual Studio2013解决面试题之0409判断一个栈是否另外一个栈的弹出序列_数据_04

3)点击“本地Windows调试器”运行

基于visual Studio2013解决面试题之0409判断一个栈是否另外一个栈的弹出序列_出栈_05


程序运行结果

基于visual Studio2013解决面试题之0409判断一个栈是否另外一个栈的弹出序列_原始数据_06