###### 栈计算器 Calculator1.0

.  就目前所学，还写不出其他什么值得记录的东西。先这样O(∩_∩)O

#include <iostream>
#include <string>
#include <stack>
#include<cctype>
using namespace std;
bool IsOne(char c){
return (c == '+' || c == '-');
}
bool IsTwo(char c){
return (c == '*' || c == '/');
}
string Infix_Postfix(string Infix){//中缀改后缀
stack<char> stack;
string result;
for (int i = 0; i<Infix.size(); i++){
if (isdigit(Infix[i]) || Infix[i] == '.')//函数isdigit()， 参数是数字，返回真
{
while (isdigit(Infix[i]) || Infix[i] == '.')
{result += Infix[i++]; }
i--;//while循环最后多加了一次，减回去.*
result += ' '; //不同数字之间用空格隔开

}
else if (IsOne(Infix[i])){ //读到一级运算符
while (stack.size() && (IsOne(stack.top()) || IsTwo(stack.top()))){ //A&&(B||C)形式
result += stack.top();
stack.pop();
}
stack.push(Infix[i]);
}

else if (Infix[i] == ')'){  //括号优先
while (stack.top() != '('){
result += stack.top();
stack.pop();
}
stack.pop();//最后记得弹出"("
}
else if (IsTwo(Infix[i])){  //读到二级运算符
while (stack.size() && IsTwo(stack.top())){
result += stack.top();
stack.pop();
}
stack.push(Infix[i]);//压入二级运算符
}
else stack.push(Infix[i]);
}
while (stack.size()){
result += stack.top();
stack.pop();
}
return result;
}

double TenTimes(int n){
double res = 1;
for (int i = 0; i<n; i++){
res *= 10;
}
return res;
}

double Achieve(string s){ // 实现了大于9以及小数的计算
double res = 0;
char c;
int dec = 0;
for (int i = 0; i < s.size(); i++){
c = s[i ];
if (c == '.')  dec = i; //标记小数点在第几位
else if (!dec) res = res * 10 + c - '0';//只要往后一位，前面的计算结果*10
else res += (c - '0') / TenTimes(i-dec);//计算小数值
}
return res;
}

double Calculate(string s){
double res, t;
stack<double> num;
string temp;
for (int i = 0; i<s.size(); i++){
temp = "";
if (isdigit(s[i]) || s[i] == '.'){
while (isdigit(s[i]) || s[i] == '.') temp += s[i++]; //如果最后一位是数字，这样做会出错
num.push(Achieve(temp));
}
else{
switch (s[i]){
case '+': t = num.top(); num.pop(); t += num.top(); num.pop(); num.push(t); break;
case '-': t = num.top(); num.pop(); t = num.top() - t; num.pop(); num.push(t); break;
case '*': t = num.top(); num.pop(); t *= num.top(); num.pop(); num.push(t); break;
case '/': t = num.top(); num.pop(); t = num.top() / t; num.pop(); num.push(t); break;
default: cerr << "Fatal Error! Result would be wrong!" << endl; system("pause"); break;
}
}
}
res = num.top();
return res;
}

int main(){
string mid, result;

cin >> mid;
result = Infix_Postfix(mid);
cout << "Infix change to Postfix： " << endl;
cout << result << endl;
cout << "The result is: " << Calculate(result) << endl;
system("pause");
return 0;
}

#### 巧妙利用栈实现计算器

2016-06-04 18:41:28

#### c++栈实现简单计算器

2017-10-10 13:50:16

#### 用栈实现简单的计算器

2017-02-15 16:32:00

#### 复习数据结构，用java栈写了个计算器

2017-09-07 12:41:03

#### c++ 数据结构 *** 栈的应用——计算器

2016-01-08 11:04:08

#### 【C++】C++顺序栈实现的计算器

2016-09-08 14:05:50

#### 栈的应用——实现简易计算器（一）

2016-03-29 13:05:04

#### C语言-数据结构-栈运用实例-计算器源代码

2016-07-27 23:02:45

#### Java用栈实现的计算器

2013年12月01日 10KB 下载

#### 用栈实现的计算器

2017-05-05 22:44:51