当前位置: 代码迷 >> 综合 >> silent 栈
  详细解决方案

silent 栈

热度:46   发布时间:2024-02-11 13:17:26.0

又是被dp(动态规划)搞炸的一天,今天讲讲这个玩意儿吧。
是一种数据结构,跟数组不同的是,数组通过形如a[i]的形式访问数组中的每一个元素,数组里任意一个元素都可以随意访问以及随意更改,而栈只能访问最顶端的一个数据,也只能更改栈顶的数据,而且你可以把栈看成一个木桶,你先往里面丢的衣服,叠在最下面,当其他人也丢衣服进去,后面丢的会先拿到衣服,看到这里你应该已经知道栈是一个先进后出的数据结构了。
在c++中调用栈这个结构需要用到一个头文件库stack,同时定义它也需要stack,形式是这样的stack<类型>变量名;调用系统的栈有几个函数操作你需要学过,分别是
栈名.push(压进栈顶元素的值);也就是让一个数值进入栈中。
栈名.pop( );让栈最顶端的元素消失。
栈名.top( );调用这个函数会返回栈最顶端的值。
栈名.empty();调用这个函数会返回一个bool类型的值,false表示栈不是空的,里面有数值存在,true表示栈是空的,里面没有数值。
栈名.size( );调用这个函数会返回栈里有几个数值。
当然你如果觉得调用系统库太麻烦,可以自己用数组模拟一个栈,具体做法就是开一个足够大的数组,然后设置一个变量为零,每当有一个数值进入你模拟栈的这个数组,这个变量就加1,这个变量其实也就是记录你栈顶在哪里,那么要数值出栈怎么办呢,只要把你指向栈顶的变量减1就可以了,不必把要弹出的数值修改为零什么的,因为你下次输入的时候刚好可以覆盖掉这个值,那么模拟栈有什么好处呢,好处就是你可以随意访问栈的元素了,系统栈是做不到这一点的。
讲了这么多,你可能还是不知道栈有什么用,我为什么不直接用数组,数组难道不香吗,那有些特殊题目还真的不香,举一道特别经典的栈题吧,只要讲到栈必讲的题。
表达式括号匹配:
假设一个表达式有英文字母(小写)、运算符(+,—,?,/)和左右小(圆)括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”;否则返回“NO”。表达式长度小于255,左圆括号少于20个。
输入数据是一整行表达式
输出数据是YES或者NO

这一题一看,用上数组来做很不好做对不对,那么栈在做这个题有什么优势呢,题目只要求看括号是否匹配,那么我们完全可以舍去其他数据,当碰到左括号是让括号入栈然后碰到右括号让左括号和右括号开心牵手离去,当右括号看到栈里没有左括号时说明右括号多了一个,那么可以直接输出NO了,当数据输入结束时,栈里应该是空的,如果里面还有数据说明有一个左括号多余了,这时也输出NO,如果数据处理完了发现栈里空了,说明所有左括号和右括号都开心牵手了,这时就可以输出YES了。
这是用栈来做的一个思路,当然你也可以用其它思路,但是如果学了栈再来做这题最容易想到的肯定是用做的。
water water water