
四则运算(c++)
【代码】四则运算(c++)
·
#include<bits/stdc++.h>
using namespace std;
//判断优先级
int primer(char a){
if(a=='(') return 6;
if(a == '*'|| a=='/') return 2;
if(a==')') return 0;
else return 1;
}
//计算
double count(double a, double b, char ch){
if(ch == '+') return a+b;
else if(ch == '-') return a-b;
else if(ch == '*') return a*b;
else if(ch == '/') return a/b;
}
//把字符串转为数字
double change(string s, int flag){
int i,n = s.size();
double shuzi1 = 0, shuzi2=0;
if(flag==0)for(i = n-1; i >=0;i-- ){
shuzi1=shuzi1+(s[i]-'0')*pow(10,n-i-1);
}
else{
string str1, str2;
for(i=0;i<s.size();i++){
if(s[i]!='.')str1.append(1,s[i]);
else{
i++;
for(;i<s.size();i++){
str2.append(1,s[i]);
}
}
}
for(i = str1.size()-1; i >=0;i-- ){
shuzi1=shuzi1+(s[i]-'0')*pow(10,str1.size()-i-1);
}
int x=-1;
for(i = 0; i < str2.size();i++ ){
shuzi2=shuzi2+(str2[i]-'0')*pow(10,x);
x--;
}
}
return shuzi1+shuzi2;
}
int main(){
printf("请输入要计算的表达式:");
stack<char>Stack; //存运算符
string str, str2; //str1读取字符串, str2存后缀表达式
cin >> str;
int cnt = 0, i;
for(i = 0; i<str.size(); i++){
char ch = str[i];
//当读取到str1的运算符时
if(ch=='+' || ch=='*' ||ch=='-' || ch=='/' || ch=='(' || ch==')'){
if(cnt == 0){
Stack.push(ch);
cnt++;
continue;
}
if(Stack.empty()) Stack.push(ch);
else if(primer(ch) > primer(Stack.top()))Stack.push(ch); //当准备入栈的运算符优先级>栈顶运算符优先级时
//当准备入栈的运算符优先级<=栈顶运算符优先级时
else {
while(1){
if(Stack.top()=='(') break;
if(ch==')'){
while(1){
if(Stack.top()=='('){Stack.pop(); break;}
str2.append(1,Stack.top());
Stack.pop();
}
break;
}
str2.append(1,Stack.top());
Stack.pop();
if(Stack.empty())break;
if(primer(ch) > primer(Stack.top()))break;
}
if(ch!='('&&ch!=')')Stack.push(ch);
}
}
//当读取到str1的数字时
else {
str2.append(1,'#');
while(1){
if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'||str[i]=='\0')break;
if(str[i]==')'){break;}
str2.append(1,str[i]);
i++;
}
i--;
str2.append(1,'#');
}
}
while(!Stack.empty()){
str2.append(1,Stack.top());
Stack.pop();
}
printf("后缀表达式为:");
cout<<str2<<endl;
//str2 为后缀表达式
stack<double>stack2; //该栈存要运算的数字,当读取到str2的运算符时需要出栈两个数字运算后再入栈
i = 0; //(注意:第2次出栈的数字+运算符+第1次出栈的数字,两个数字的运算顺序别整反了)
while(1){
if(str2[i] == '+' || str2[i] == '-' || str2[i] == '*' || str2[i] == '/') {
double a = stack2.top() ;
stack2.pop();
double b = stack2.top() ;
stack2.pop();
stack2.push(count(b, a, str2[i]));
i++;
}
else {int count = i+1;
int flag=0;
string s;
while(str2[count]!='#'){
if(str2[count]=='.') flag = 1;
s.append(1,str2[count]);
count++;
}
i = count+1;
stack2.push(change(s,flag));
}
if(i == str2.size())break;
}
printf("计算结果:");
cout<<stack2.top();
}
更多推荐
所有评论(0)