WUSTOJ 算数表达式求值【数据结构-栈和队列的综合应用】

本文介绍了如何使用栈和队列解决算术表达式求值的问题,包括转换为后缀表达式、处理括号、优先级错乱以及字符串数字的转换。通过AC代码和解题思路,详细讲解了算法实现过程。
摘要由CSDN通过智能技术生成

经典题.题目描述:
1005: 算术表达式的求值
Time Limit: 1 Sec Memory Limit: 65535 MB 64bit IO Format: %lld
Description
通过程序来完成任意算术表达式的求值。表达式中包含的运算符包括+,-,*,/,()等5类。运算对象均为整数。

Input
包含多组测试数据。每组测试数据一个算术表达式,占一行。每个表达式不超过100个字符。
Output
输出每个算术表达式的计算结果(按照C语言运算规则),一个结果占一行。
Sample Input 4+23-10/5
3
(7-2)
2*3/2

Sample Output
8
15
3

解题思路:

1.转换为后缀表达式例如3x5+4x6->3 5 x 4 6 x +。
2.优先级高的运算放在前面,先操作,也如上3546的操作,优先级高的后入栈,以之后入队操作先行入队。
3.括号的处理问题,本题最大难点好像也就是这里了。这里处理的方法是:单独将括号这个部分扒出来,括号结束后该部分运算直接入队,尽可能地放到前面进行运算,这样便确保了括号运算的优先级问题。
4.优先级错乱的处理。也如上述例子,‘+’位于‘x’之间,则先将‘x’入栈,遇到‘+’后‘x’直接入队,则前面的‘x’在后面的‘+’之前运算,之后的一个‘x’优先级顺序排到栈顶,之后入队也是先运算。
5.字符串数字的处理。利用函数atoi(char*)可将可将形如‘1’,‘2’,‘3’的字符串数组转换为数字123.
AC代码及注释如下:

#include<bits/stdc++.h>
using namespace std;
queue<char> q;
stack<char> s;stack<int> s1;
char a[1000];char str[1000];
int adv(char ch)//判断优先级,注意这里只要先乘除后加减就可以了,相同优先级直接交换计算顺序无影响
{
   
    if(ch == '+' || ch == '-')return 1;
    if(ch=='*'||ch =='/')return 2;
    return 0;
}
int main()
{
   
    int i,tmp,k;
    while(~scanf("%s",a))
    {
   
        int len=strlen(a);//将中缀表达式变为后缀表达式,放在队列中 
        for(i=0;i<len;i++)//字符串解析
        {
   
            if(a[i]>='0'&&a[i
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值