栈与队列数据结构概述
栈是限定仅在表尾进行插入和删除操作的线性表;
队列是只允许在一端进行插入操作、而在另一端进行删除操作的线性表;
1 栈
允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出的线性表,栈的数据存储结构分为以下两种。
![cf42de2066db0d9b48146c0af35aedf5.png](https://i-blog.csdnimg.cn/blog_migrate/cf325f1c4a41db1ffc131e8df3d2a15d.jpeg)
栈的抽象数据类型分为顺序栈和链式栈两种,栈接口的继承和实现关系如下图
![8cab66b7cf86d6496f7e68b0fe7f8cb2.png](https://i-blog.csdnimg.cn/blog_migrate/9aa44bad1575da34019fd40519734e6f.jpeg)
1.1 栈的顺序存储结构(顺序栈)
如用数组实现,栈底是下标为0的元素。
![9ecb785362ea71d4738f08a73acb0c10.png](https://i-blog.csdnimg.cn/blog_migrate/e74b65a0dd7684aea93526b5a3fef29d.jpeg)
1.2 栈的链式存储数据结构(链式栈)
![2a80e8707966abb31b4d3ac51cdf5357.png](https://i-blog.csdnimg.cn/blog_migrate/19445e58b5599e9f17031e1fd939b857.jpeg)
链栈的入栈
![8e817de5b14a95b348e59ac29958aedc.png](https://i-blog.csdnimg.cn/blog_migrate/a09b88436e6d58537d082d8b1d05803e.jpeg)
![094144b08e1821b84ed476290026b4f2.png](https://i-blog.csdnimg.cn/blog_migrate/dc2a35516efa9bff8c049f1da52067f8.jpeg)
链栈的出栈
![60f288c840c50de148d6c888e7dc4ccc.png](https://i-blog.csdnimg.cn/blog_migrate/3f8e20a8f2dbe3ce987ab8a41e1f0359.jpeg)
![98532200b2473bc60d9186f497da6cd8.png](https://i-blog.csdnimg.cn/blog_migrate/efb747544562bbc05ea8c4298250fa1d.jpeg)
1.3 栈的应用场景
** 1、栈是嵌套调用机制的实现基础**
嵌套调用定义:在一个函数中调用另一个函数被称为嵌套调用。
由于函数的调用顺序和返回顺序正好相反,如果借助一个栈“记住”函数从何而来,就能获得函数的返回路径。
当函数被调用的时候操作系统将该函数的有关信息(地址,参数,局部变量等)入栈这个过程称为保护现场。
一个函数执行完返回时,出栈,获得调用函数信息,称为恢复现场,程序返回调用函数继续运行。
** 2、 逆波兰表达式 **
定义:
传统的四则运算被称作是中缀表达式,即运算符实在两个运算对象之间的。逆波兰表达式被称作是后缀表达式,表达式是在运算对象的后面。
逆波兰表达式:
a+b ---> a,b,+
a+(b-c) ---> a,b,c,-,+
a+(b-c)d ---> a,b,c,-,d,,+
a+d(b-c)--->a,d,b,c,-,,+
a=1+3 ---> a=1,3 +
http=(smtp+http+telnet)/1024 写成什么呢?
http=smtp,http,+,telnet,+,1024,/
代码实现 :
/** * 计算算数表达式的值 * For example: * ["2