数据结构括号匹配代码_栈,括号匹配,汉诺塔

f37d252c5ae5250cffa5328ce7468a4c.png什么是栈? 栈与线性表类似,栈是他们的限制版本。 栈只能够从一段插入一段删除。 是一个后进先出的数据结构。 后进先出的意思就是后来进来的先出去。 现实生活中有很多后进先出的例子,比如打印机的纸,餐馆的盘子等等。 栈可以基于线性表或者链表创建。 栈是一种特殊的线性表,其插入(入栈,压栈)与删除(出栈,弹栈)都在同一段操作。 作者自己写了一些东西来实现栈,但奇妙的是作者写的东西与C++的标准模板库冲突了。 所以,我就干脆只用标准模板库的stack了。
// 使用栈#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第一、匹配括号
“(()))(()(((()(()(()((()((())))()()”“((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这是一个小标题 关于这个汉诺塔奇奇怪怪的神话就不提了…… 就是有三根柱子,一根柱子上有三个盘子 要把第一根柱子的东西全部搬到第三根去,其中小盘子必须在大盘子上面,一次只能搬一个。 这个貌似是有规律的,然后么,次数也是有规律的。 次数: f(n)=2f(n-1)+1 f(0)=0 但不考虑次数,只考虑方法。 如果我们要搬2个盘子 那搬的顺序是: 1->2 1->3 2->3 那如果要搬n个呢? 我们可以把n个分为1个与n-1个,那个1就是最大的那个。 然后根据搬2个盘子的顺序来就行。 那n-1怎么搬? 那就把n-1分为n-2与1。 以此类推,推到1为止,再把每一步都展示出来,就完成了。 听起来真的很简单,但…………想起来真的很难 不能多想不能多想 一切关于递归的问题不能多想,越想越复杂。 如果想弄清递归的每一步,那是不可能的,要看递归到底是什么,到底在解决什么。 而不是去探究每一步都在做什么。 (说实话我就是没有好好学递归…………经典问题都没研究过…………) 我先上递归实现代码。
// 递归解决汉诺塔问题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);    }}

018fa0d46da592750fb199809e389301.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值