/* 判断某个序列是否出栈序列,比如 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调试器”运行