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




题目



解决代码及点评

/*
	判断某个序列是否出栈序列,比如 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;
}



代码下载及其运行

代码下载地址:http://download.csdn.net/detail/yincheng01/6704519

解压密码:c.itcast.cn


下载代码并解压后,用VC2013打开interview.sln,并设置对应的启动项目后,点击运行即可,具体步骤如下:

1)设置启动项目:右键点击解决方案,在弹出菜单中选择“设置启动项目”


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

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


程序运行结果









你可能感兴趣的:(基于visual Studio2013解决面试题之0409判断一个栈是否另外一个栈的弹出序列)