栈 用数组实现的栈
栈
使用中情况
初始情况
栈顶
特点:first in last out
方法(数组实现的栈)
方法操作图示
应用:
分隔符匹配
满足通配符匹配条件的情形
* {([])}
* 验证步骤
*1:便利输入字符串
*2:遇到左边型符号--> ([{ 就押入栈内
*3:遇到右边型符号--> )]} 就循环栈
*4:弹出栈顶元素 :
4.1 不匹配条件一 : 弹出的栈顶元素与遍历到的元素不匹配
4.2不匹配条件二: 遍历到某个右边型符号 ,栈却为空( 没有左边型符号与之匹配)
4.3不匹配条件三: 字符串便利结束 栈却不为空(右边型符号有多余)
单词逆序
利用栈的特性:将输入的字符串内容转制.倒叙该字符串的内容输出
例如:abcàcba
步骤:
1 将输入字符串转化为char字符数组
2 创建单链表
3 将每个 char字符分别装入链表节点当中
4 单链表执行pop(),逐一删除链表内元素 è
5 将步骤四的元素载入字符数组中,字符数组->字符串返回
解析算数表达式
算法实现步骤:
1 将算数表达式转换成另一种形式:后缀表达式
2 计算后缀表达式的值
后缀表达式: 操作符跟在两个操作数后面.
例如: A+B è AB+
A/B èA/B
把中缀表达式转换成后缀表达式
如何计算中缀表达式
3+4-5
直到看到4后面的操作符才可以计算3+4
3+4*5
这次等到算出4*5 的结果后才能做加3的运算.因为乘法运算比加法运算优先级别高.
不能计算3+4,因为*比+优先级更高.看到5时候可以计算4*5
.
3*(4+5)
这个例子里一直要读到右括号才可以计算.乘法与其他操作符相比有较高或者相同的权限.
因此通常情况下都到4就可以计算3*4了.但是括号比* 和/有更高的优先级.因此必须先计算括号中的值.然后用其结果参与其他运算.遇到有括号的时候可以做加法运算了.
我们可以直接编写这样的求值算法,但是先把表达式转换成后缀表达发计算更容易.
中缀表达式转化成后缀表达式:
将中缀表达式转换成后缀表达式不用做算术运算,他不求中缀表达式的值.只把操作数和操作符重新排列成另外一种形式.
如果中缀字符串中的字符是操作数.则立即把它复制到后缀字符串中.这就是说如果看到中缀字符串中的A时候.就立即把A写到后缀字符串里.一定不要延迟.读到操作数就复制它们.
不用去管多久后才能复制和它们关联的操作符.
决定何时复制操作符更复杂一些.但它的规则和中缀表达式时一样.一旦可以利用操作符求中缀表达式的某部分的值,就把该运算复制到后缀字符串中.
A+B*C
A*(B+C)
直到读到右括号才能向后缀表达式输出操作符号
A+B*(C-D)
转换规则: 从中缀表达式输入字符串中读取数据项然后按照下表显示的操作进行处理.