Serendipity丶


私信TA

用户名:uq_38590416266

访问量:2433

签 名:

别人的屋檐再大,不如自己手中有伞

等  级
排  名 64
经  验 10627
参赛次数 0
文章发表 33
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

唯有提高自己的核心竞争能力,才可在逆流中不断前进。

TA的其他文章

解题思路:自己看着代码 把案例过一遍 代码就明白了 自己再多敲几遍

注意事项:

参考代码:

#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 人评分

  评论区

  • «
  • »