栈
跟多内容,前往 IT-BLOG
栈的一个实际需求:请输入一个表达式,计算式:[7*2*2-5+1-5+3-3]点击计算【如下图】
一、栈的介绍
【1】栈的英文为(stack);
【2】栈是一个先入后出(FILO-First In Last Out)的有序列表;
【3】栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。
【4】根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除;
【5】出栈(pop)和入栈(push)的概念(如图所示)
二、栈的应用场景
【1】子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。
【2】处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将参数、区域变量等数据存入堆栈中。
【3】表达式的转换[中缀表达式转后缀表达式]与求值(实际解决)。
【4】二叉树的遍历。
【5】图形的深度优先(depth一first)搜索法。
三、栈的快速入门
【1】用数组模拟栈的使用,由于栈是一种有序列表, 当然可以使用数组的结构来储存栈的数据内容, 下面我们就用数组模拟栈的出栈,入栈等操作。
【2】实现思路分析,并画出示意图:定义一个栈顶元素Top默认为-1,随着数据的增加不断的递增。当获取元素时Top递减。
四、经典案例
对文章开始提出的计算需求,通过栈进行解决:计算式:[7*2*2-5+1-5+3-3] 点击计算
实现思路:① 通过index 下标遍历表达式的值;② 如果发现是数字,就直接入数字栈;③ 如果发现是符号则判断当前的符号栈是否为空,空则直接入栈。否则需要将当前符号与栈顶符号进行优先级比较,如果当前优先级低于栈顶优先级,就需要从数字栈中pop 出前两个数字,再从符号栈中pop出栈顶符号,进行计算并将结果push到数字栈,继续比较当前符号与栈中的优先级,如果大于栈中的优先级则直接入符号栈;④ 如果表达式插入完毕后,就顺序的从数字栈和符号栈获取元素,进行计算;⑤ 正常情况下,最后在数栈中会保留一个数字,就是表达式的结果;