简单四则运算表达式计算(仅包含+,-,*,/,(,)),构造的二叉树左儿子是数,右儿子是操作符
代码:
简单计算器(C++)
#include "iostream"
#include "cstring"
#include "algorithm"
#include "cmath"
#include "cstdio"
#include "sstream"
#include "queue"
#include "vector"
#include "string"
#include "stack"
#include "cstdlib"
#include "deque"
#include "fstream"
using namespace std;
typedef long long LL;
const int INF = 0x6fffffff;
stack<double> NS;
stack<char> OS;
void update()
{
char op = OS.top(); OS.pop();
double n1 = NS.top(); NS.pop();
double n2 = NS.top(); NS.pop();
if(op == '+')
NS.push(n1+n2);
else if(op == '-')
NS.push(n2-n1);
else if(op == '*')
NS.push(n1*n2);
else if(op == '/')
NS.push(n2/n1);
}
void dfs(string line)
{
for(int i = 0 ; i < line.size() ; i++)
{
if(line[i] == ' ')
continue;
if(line[i] == '+' || line[i] == '-')
{
while(!OS.empty() &&(OS.top() != '(' && OS.top() != ')' ))
update();
OS.push(line[i]);
}
else if(line[i] == '*' || line[i] == '/')
{
while(!OS.empty() && (OS.top() == '*' || OS.top() == '/'))
update();
OS.push(line[i]);
}
else if(line[i] == '(')
OS.push('(');
else if(line[i] == ')')
{
while(OS.top() != '(')
update();
OS.pop();
}
else
{
int num=0;
while(isdigit(line[i]))
{
num = num*10+(line[i]-'0');
i++;
}
i--;
NS.push(num);
}
}
while(!OS.empty())
update();
printf("%.2lf\n",NS.top());
}
int main()
{
string line;
while(getline(cin,line) && line != "0")
{
while(!OS.empty())
OS.pop();
while(!NS.empty())
NS.pop();
dfs(line);
}
return 0;
}
简单计算器(java)
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] argv) throws IOException
{
Scanner in = new Scanner(new BufferedInputStream(System.in));
while(in.hasNext())
{
String line = in.nextLine();
if(line.length() < 1)
continue;
if(line.equals("0"))
break;
double ans = dfs(line);
/*if(ans == 0)
System.out.println(0);
else*/
System.out.printf("%.2f\n",ans);
}
}
static double dfs(String line)
{
Stack<Double> NS = new Stack<Double>();
Stack<Character> OS = new Stack<Character>();
StringTokenizer tokens = new StringTokenizer(line , "()+-*/" , true);
while(tokens.hasMoreTokens())
{
String cur = tokens.nextToken().trim();
if(cur.charAt(0) == '+' || cur.charAt(0) == '-')
{
while(!OS.isEmpty() &&
(OS.peek() == '+' ||
OS.peek() == '-' ||
OS.peek() == '*' ||
OS.peek() == '/' ))
update(NS,OS);
OS.push(cur.charAt(0));
}
else if(cur.charAt(0) == '*' || cur.charAt(0) == '/')
{
while(!OS.empty() &&
(OS.peek() == '*' ||
OS.peek() == '/'))
update(NS,OS);
OS.push(cur.charAt(0));
}
else if(cur.trim().charAt(0) == '(')
OS.push('(');
else if(cur.trim().charAt(0) == ')')
{
while(OS.peek() != '(')
update(NS,OS);
OS.pop();
}
else
NS.push(new Double(cur));
}
while(!OS.empty())
update(NS,OS);
return NS.pop();
}
static void update(Stack<Double> NS , Stack<Character> OS)
{
char op = OS.pop();
double n1 = NS.pop();
double n2 = NS.pop();
if(op == '+')
NS.push(n1+n2);
else if(op == '-')
NS.push(n2-n1);
else if(op == '*')
NS.push(n1*n2);
else if(op == '/')
NS.push(n2/n1);
}
}