解题思路:自己看着代码 把案例过一遍 代码就明白了 自己再多敲几遍
注意事项:
参考代码:
#include<bits/stdc++.h>
using namespace std;
stack<int>num;//存放数字
stack<char>s;//存放运算符
char c[50];//存放原始式子
int x;
//计算 取出前面俩个数和运算符计算 把新得的数入栈
void f1()
{
int la = num.top();
num.pop();
int lb = num.top();
num.pop();
char c = s.top();
s.pop();
if(c == '+') num.push(la+lb);
if(c == '-') num.push(lb-la);
if(c == '*') num.push(la*lb);
if(c == '/') num.push(lb/la);
if(c == '^') num.push(pow(lb,la));
}
//符号优先级
int f2(char ch){
if(ch=='^')return 3;
if(ch=='*'||ch=='/')return 2;
if(ch=='+'||ch=='-')return 1;
return 0;
}
int main()
{
// 从下标为1输入
cin >> c+1;
//将c[0]赋值为左括号 为计算最后的式子
c[0] = '(';
//将c的最后一个赋值为右括号 与第一个匹配
c[strlen(c)] = ')';
// flag 为标记 将俩个运算符之间的数字标记
int flag = 0;
//x存放可能会有的多位数
x = 0;
//遍历
for(int i = 0 ; i < strlen(c) ;i++)
{
//为数字
if(c[i] >= '0' && c[i] <= '9')
{
x = x * 10 + c[i] - '0';
flag = 1;
//既然是数字 计算一下就可以跳过了
continue;
}
if(flag == 1)
{
//将所得数字存放在num栈里面 x和flag 重置
num.push(x);
x = 0,flag = 0;
}
if(c[i] == '(')
{
//如果是左括号进s栈就行 然后结束本轮循环
s.push(c[i]);
continue;
}
if(c[i] == ')')
{
//计算俩个括号之间的 遇到左括号结束
while(s.top() != '(')
f1();
//将左括号移出栈
s.pop();
// 结束本次循环
continue;
}
//如果s栈为空 则遇到运算符号直接进栈
if(s.empty()) s.push(c[i]);
else
{
//这里比较运算符号的优先级
while(f2(s.top()) >= f2(c[i]))
f1();
//再将该运算符号入栈s
s.push(c[i]);
}
}
//最后所得就是要求值
cout << num.top();
return 0;
}
0.0分
0 人评分
C语言程序设计教程(第三版)课后习题11.1 (C语言代码)浏览:822 |
买不到的数目 (C++代码)浏览:909 |
C语言程序设计教程(第三版)课后习题6.4 (C语言代码)浏览:639 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:863 |
2003年秋浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:638 |
数对 (C语言代码)浏览:762 |
Hello, world! (C语言代码)浏览:766 |
1118(求助_已解决)浏览:351 |
C语言程序设计教程(第三版)课后习题1.6 (C语言代码)浏览:692 |
简单的a+b (C语言代码)浏览:542 |