3-2栈和队列-应用

一.栈的应用
(一)栈的应用
1.括号匹配

#define MaxSize 50
typedef struct {
	ElemType data[MaxSize];
	int top;
}SqStack;

void InitStack(SqStack &S){
	S.top = -1;
}

bool Push(SqStack &S,ElemType x){
	if (S.top = MaxSize-1)
		return false;
	S.data[++S.top] = x;
	return true;
}

bool StackEmpty(SqStack S) {
	if (S.top == -1)
		return true;
	else
		return false;
}

bool Pop(SqStack &S,ElemType &x){
	if (S.top == -1)
		return false;
	x = S.data[S.top--];
	return true;
}

bool bracketCheck(char str[], int length) {
	SqStack S;
	InitStack(S);
	for (int i = 0; i < length; i++) {
		if (str[i] == '(' || str[i] == '[' || str[i] == '{') {
			Push(S, str[i]);
		}
		else {
			if (StackEmpty(S))
				return false;
			char topElem;
			Pop(S, topElem);
			if (str[i] == ')' && topElem != '(')
				return false;
			if (str[i] == ']' && topElem != '[')
				return false;
			if (str[i] = '}' && topElem != '{')
				return false;
		}
	}
	return StackEmpty(S);
}

2.表达式求值

(1)中缀转后缀
①按优先级(有括号的先算括号),结合左优先原则,给运算符标注次序
在这里插入图片描述
②后缀,运算符写后面
对于1,写为ab+
对于2,写为cd*
对于3,原来在左边的数还在左边,写为ab+cd*-

练习1
在这里插入图片描述
答案:15 7 1 1 + - ÷ 3 × 2 1 1 + + -

练习2
在这里插入图片描述
答案:AB+ CD*E/ -F+

(2)后缀转中缀
按从左到右,划线法,原来在左边的还在左边
在这里插入图片描述
中缀:(a+b) - (c*d)
即a+b-c*d

练习1
在这里插入图片描述
答案:A+B-C*D/E+F

练习2
在这里插入图片描述
答案:(15÷(7-(1+1)))×3 - (2+(1+1))

(3)中缀转前缀
按优先级(有括号的先算括号),结合右优先原则,给运算符标注次序,然后依次处理。前缀,运算符写前面
在这里插入图片描述
对于1,cd
对于2,-b
cd
对于3,原来在前面的还在前面,+a-b*cd

练习1
在这里插入图片描述
答案:+A-*B-CD/EF

练习2
在这里插入图片描述
答案:- × ÷ 15 - 7 + 1 1 3 + 2 + 1 1

(4)前缀转中缀
从右往左,划线法,依次处理
在这里插入图片描述
答案:(a+b) - (cd)
即a+b-c
d

练习1
在这里插入图片描述
答案:A+B*(C-D)-E/F

练习2
在这里插入图片描述
答案:(15÷(7-(1+1)))×3 - (2+(1+1))

总结
在这里插入图片描述
(5)前缀表达式的计算(操作数栈)
后缀是从左往右,前缀都是从右往左
例:
- × ÷ 15 - 7 + 1 1 3 + 2 + 1 1
从右往左
1入栈,1入栈,遇到+号,栈顶两个1弹出,计算1+1=2*,压入栈
2入栈,两个元素弹出,2+2*=4,压入栈
1入栈,1入栈,遇到+,弹出计算=2入栈
7入栈,弹出7-2=5入栈
15入栈,弹出15÷5=3入栈
3入栈,弹出3×3
=9入栈
遇到-号,9-4=5,完成

后缀同理,从左往右

(6)用栈实现中缀转后缀(运算符栈)
从左往右,仅运算符入栈,操作数直接加入后缀表达式,依次弹出栈中优先级≥当前运算符的所有运算符,并加入后缀表达式。遇到(直接入栈,遇到)依次弹出栈内运算符加入后缀表达式,碰到(或栈空停止。(不加入后缀表达式。总结:相等弹出,内大弹出,外大压入

中缀:A+B-C*D/E+F
A,后缀表达式:A
+入栈,栈内:+
B,表达式:AB
-(≤+的优先级,+弹出),表达式:AB+
-入栈,栈内:-
C,表达式AB+C
*(>-的优先级,入栈),栈内:-*(从底到顶)
D,表达式AB+CD
/(≤*的优先级,*弹出),栈内:-,表达式AB+CD*
/入栈,栈内:-/(从底到顶)
E,表达式AB+CD*E
+(≤/的优先级,/弹出),栈内:-,表达式:AB+CD*E/
+(≤-的优先级,-弹出),栈内:空,表达式AB+CD*E/-
+入栈
F,表达式:AB+CD*E/-F
+弹出,表达式:AB+CD*E/-F+

(7)用栈实现中缀表达式的计算
=中缀转后缀(运算符栈)+后缀求值(操作数栈)
后缀:从左到右
例:
A+B-C*D/E+F
运算符栈:+
操作数栈:AB
遇到-,+出栈,-入栈
+出栈后需要两个操作数运算,AB出栈,结果记为t1,压入操作数栈
运算符栈:- *
操作数栈:t1 C D
遇到/,*出栈,C*D记为t2,压入操作数栈,/入栈
运算符栈:- /
操作数栈:t1 t2 E
遇到+,/出栈,t2/E记为t3,压入操作数栈。-出栈,t1-t3记为t4,压入操作数栈。+入栈
运算符栈:+
操作数栈:t4 F
+出栈,t4+F为运算结果

总结
用栈实现前缀表达式的计算(操作数栈)
用栈实现中缀转后缀(运算符栈)
用栈实现中缀表达式的计算=中缀转后缀(运算符栈)+后缀求值(操作数栈)[中缀不能直接计算]

3.递归

(二)队列的应用
1.树的层次遍历
2.图的广度优先遍历
3.计算机系统中的应用
(1)解决主机与外部设备直接速度不匹配的问题
(2)解决由多用户引起的资源竞争问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡__卡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值