计算算术表达式
程序在VS2005下调试成功。
// cppTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <cassert>
#include <cmath>
#include <ctime>
using namespace std;
double parseNum(string str, int start, int end)
{
string temp = str.substr(start, end - start);
assert(!temp.empty());
return atof(temp.c_str());
}
bool isNum(char c)
{
return c >= '0' && c <= '9';
}
bool isAlpha(char c)
{
return c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z';
}
double Compute(double a, double b, char c)
{
switch (c)
{
case '+':
return a + b;
break;
case '-':
return a - b;
break;
case '*':
return a * b;
break;
case '/':
return a / b;
break;
default:
assert(false);
return 0;
}
}
void DoCompute(double Num[], char Oper[], int& i, int& j)
{
double a, b;
a = Num[i - 2], b = Num[i - 1];
char c = Oper[j - 1];
double result = Compute(a, b, c);
Num[i - 2] = result;
i--; j--;
}
int main(int argc, char* argv[])
{
char operand[128];//运算符栈
double data[128];//操作数栈
//char word[16];//
string statement;//用户输入的算术表达式
memset(operand, '/0', sizeof(operand));
memset(data, '/0', sizeof(data));
//memset(word, '/0', sizeof(word));
int a = 0, b = 0;
int s = 0, t = 0;
bool l = false;//上一个字符是数字吗
cout << "请输入一个算术表达式:";
cin >> statement;
//statement = "((2*3)*((2*2))+3)";
//statement += "#";
int start = 0;
for (int i = 0; i < statement.length(); i++)
{
char c = statement[i];
switch(c)
{
case '+':
case '-':
if (l)
{
b = i;
data[s++] = parseNum(statement, a, b);
l = false;
}
if (t>0 && operand[t-1] != '(')
DoCompute(data, operand, s, t);
operand[t++] = c;
break;
case '*':
case '/':
if (l)
{
b = i;
data[s++] = parseNum(statement, a, b);
l = false;
}
if (t > 0 && operand[t-1] != '(' && (operand[t-1] == '*' || operand[t-1] == '/'))
DoCompute(data, operand, s, t);
operand[t++] = c;
break;
case '(':
if (l)
{
cout << "wrong, position=" << i << endl;
return 1;
}
operand[t++] = '(';
break;
case ')':
if (l)
{
b = i;
data[s++] = parseNum(statement, a, b);
l = false;
}
while(operand[t-1] != '(')
DoCompute(data, operand, s, t);
/*if (operand[t-1] != '(')
{
cout << "wrong, position=" << i << endl;
return 1;
}*/
t--;
break;
default:
if (isNum(c))
{
if (l)
b = i;
else
{
a = i;
l = true;
}
}
}
}
if (l)
{
b = statement.length();
data[s++] = parseNum(statement, a, b);
l = false;
DoCompute(data, operand, s, t);
}
cout << "result: " << data[0] << endl;
return 0;
}
//
#include "stdafx.h"
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <cassert>
#include <cmath>
#include <ctime>
using namespace std;
double parseNum(string str, int start, int end)
{
string temp = str.substr(start, end - start);
assert(!temp.empty());
return atof(temp.c_str());
}
bool isNum(char c)
{
return c >= '0' && c <= '9';
}
bool isAlpha(char c)
{
return c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z';
}
double Compute(double a, double b, char c)
{
switch (c)
{
case '+':
return a + b;
break;
case '-':
return a - b;
break;
case '*':
return a * b;
break;
case '/':
return a / b;
break;
default:
assert(false);
return 0;
}
}
void DoCompute(double Num[], char Oper[], int& i, int& j)
{
double a, b;
a = Num[i - 2], b = Num[i - 1];
char c = Oper[j - 1];
double result = Compute(a, b, c);
Num[i - 2] = result;
i--; j--;
}
int main(int argc, char* argv[])
{
char operand[128];//运算符栈
double data[128];//操作数栈
//char word[16];//
string statement;//用户输入的算术表达式
memset(operand, '/0', sizeof(operand));
memset(data, '/0', sizeof(data));
//memset(word, '/0', sizeof(word));
int a = 0, b = 0;
int s = 0, t = 0;
bool l = false;//上一个字符是数字吗
cout << "请输入一个算术表达式:";
cin >> statement;
//statement = "((2*3)*((2*2))+3)";
//statement += "#";
int start = 0;
for (int i = 0; i < statement.length(); i++)
{
char c = statement[i];
switch(c)
{
case '+':
case '-':
if (l)
{
b = i;
data[s++] = parseNum(statement, a, b);
l = false;
}
if (t>0 && operand[t-1] != '(')
DoCompute(data, operand, s, t);
operand[t++] = c;
break;
case '*':
case '/':
if (l)
{
b = i;
data[s++] = parseNum(statement, a, b);
l = false;
}
if (t > 0 && operand[t-1] != '(' && (operand[t-1] == '*' || operand[t-1] == '/'))
DoCompute(data, operand, s, t);
operand[t++] = c;
break;
case '(':
if (l)
{
cout << "wrong, position=" << i << endl;
return 1;
}
operand[t++] = '(';
break;
case ')':
if (l)
{
b = i;
data[s++] = parseNum(statement, a, b);
l = false;
}
while(operand[t-1] != '(')
DoCompute(data, operand, s, t);
/*if (operand[t-1] != '(')
{
cout << "wrong, position=" << i << endl;
return 1;
}*/
t--;
break;
default:
if (isNum(c))
{
if (l)
b = i;
else
{
a = i;
l = true;
}
}
}
}
if (l)
{
b = statement.length();
data[s++] = parseNum(statement, a, b);
l = false;
DoCompute(data, operand, s, t);
}
cout << "result: " << data[0] << endl;
return 0;
}
posted on 2007-09-20 21:09 preternatural 阅读(257) 评论(1) 编辑 收藏 举报