![f37d252c5ae5250cffa5328ce7468a4c.png](https://i-blog.csdnimg.cn/blog_migrate/26a743d737af129e178affcd8e268ff6.png)
// 使用栈#include // 新建栈stack<int> A// 判断栈是否为空A.empty()// 压栈(添加一个数)A.push(i)// 弹栈(删除顶部的数)A.pop()// 返回栈的空间A.size()// 返回栈顶的元素A.top()
以下是栈的测试
// 栈的测试void Stack_A(){ stack<int> A; // 判断栈是否为空 cout << A.empty() << endl; for (int i = 1; i <= 10; i++) { cout << "压栈,数:" << i<< endl; A.push(i); } // 输出栈的空间数量 cout << A.size() << endl; for (int i = 1; i <= 10; i++) { cout << "弹栈,数:" << A.top()<< endl; A.pop(); }}
接下来讲一些奇奇怪怪的例题来使用栈
![f37d252c5ae5250cffa5328ce7468a4c.png](https://i-blog.csdnimg.cn/blog_migrate/26a743d737af129e178affcd8e268ff6.png)
“(()))(()(((()(()(()((()((())))()()”“((1+2)*3/5+(16*8)-1)”
给你以上这么一组括号或一组字符串,判断他们的括号是否一一匹配。
(()) 这样就算匹配
(() 这样就不算匹配
()() 这样也算匹配
这时候栈就变得非常实用。
首先我们开始遍历数组,先寻找“(”,每找到一个就将其加入栈。
如果找的数不是“(”,而是其他符号,则忽略。
如果是“)”,则要弹栈,将前面的“(”弹出,说明匹配完成一个括号。
最后,如果栈为空,则说明所有括号匹配完成。
若栈还有,则就没有匹配完成。
当然在过程中,若栈已经空了,又找到了“)”,那肯定也是没有匹配完成的。
// 匹配括号void Match_Brackets(string strs){ stack<int> s; int length = (int)strs.size(); // 扫描strs寻找左括号和有括号 for (int i = 0; i < length; i++) { // 左括号,压栈 if (strs.at(i) == '(') s.push(i); // 为右括号 else if (strs.at(i) == ')') { // 如果为右括号同时栈不为空 if (!s.empty()) { s.pop(); } else { cout << "括号不匹配!" << endl; return; } } } // 遍历结束,栈不为空 if (!s.empty()) { cout << "括号不匹配!" << endl; }}
![f37d252c5ae5250cffa5328ce7468a4c.png](https://i-blog.csdnimg.cn/blog_migrate/26a743d737af129e178affcd8e268ff6.png)
// 递归解决汉诺塔问题void Towers_Of_Hanoi(int n, int x, int y, int z){ if (n > 0) { // 将n-1从塔1搬到塔2 Towers_Of_Hanoi(n - 1, x, z, y); // 将最底下的盘子从塔1搬到塔3 cout << "移动顶端的盘子从" << x << "到" << y << endl; // 将n-1从塔2搬到塔3 Towers_Of_Hanoi(n - 1, z, y, x); }}
如果想要数据可视化,就可以用到栈来储存每一步的数据。 上代码
// 全局变量stack<int> tower[4];void moveAndShow(int, int, int, int);// 使用栈解决汉诺塔问题void towersOfHanoi(int n){ for (int d = n; d > 0; d--) // 塔的空间 tower[1].push(d); // 加入盘子 // 开始移动,将盘子由1,依赖3移动到2 moveAndShow(n, 1, 2, 3);}// 此处注意是将x移动到y塔上,而不是z塔上void moveAndShow(int n, int x, int y, int z){ // 将n个盘子从x塔依赖z塔移动到y塔,并且显示状态 if (n > 0) { moveAndShow(n - 1, x, z, y); int d = tower[x].top(); // 移动顶端 tower[x].pop(); // 弹栈 tower[y].push(d); // 压栈 // showState(); // 展示 // 展示移动过程 cout << "移动盘子" << d << "从塔" << x << "到塔" << y << endl; moveAndShow(n - 1, z, y, x); }}