抽象数据类型-栈

栈模型:
1.限制插入和删除只能在表的末尾,即栈顶
2.基本操作有push(入栈)和pop(出栈),另外还有top,top操作是探知当前栈顶是否有元素并返回
3.栈又叫做LIFO(后进先出)表

栈实现(两种方式):
1.链表实现:使用单链表,在链表头部插入实现push,删除链表头部元素实现pop,返回链表头部元素实现top.
2.数组实现:由于在数组的末端进行操作,实现方式简单,且操作更快,以常数时间运行,是更流行的实现方式

栈应用:
1.平衡符号:
1.1例如:编译器检查程序语法的准确性,使用栈来检验程序符号如花括号、大括号是否成对出现且正确,具体算法如下--
做一个空栈,开始读取要编译的文件,如果是字符是一个开放符合,则入栈,如果字符是封闭符合,则当栈空时报错,否则将栈元素出栈,并判断出栈元素和当前符号是否对应,不对应则报错,读取文件结束,栈非空则报错
2.中缀表达式转换后缀表达式:
2.1例如:将一串计算表达式:a-b*c+(d+e*f)*g转换为后缀表达式abc*+de*f+g*+,具体算法如下--
1.读到操作数时,立即放到输出中,遇到第一个操作符时入栈
2.遇到第二个操作符时,和栈顶的操作符比较,如果优先级低于或等于栈顶操作符,则将栈顶操作符出栈并放到输出中,第二个操作符入栈
3.遇到左圆括号,入栈;遇到右圆括号,将栈顶元素出栈并放入输出中,直至在栈中遇到对应的左圆括号,左圆括号出栈但不放入输出中,右圆括号丢弃
3.方法调用:
3.1例如:类似开括号和闭括号的形式,递归方法中使用栈来存储整个活动记录也叫栈帧,但是在使用递归时要特别注意,容易出现栈溢出,栈溢出的情形如下--
1.失控递归,缺少基准原则,即没有退出递归的条件或条件一直不成立
2.尾递归,递归参数中传递了大容量的对象,并且递归次数较多,这时就会导致栈中存储大量信息,出现栈溢出

参考:数据结构与算法分析




猜你喜欢

转载自blog.csdn.net/ignorewho/article/details/80635329