程序在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;
}

转载于:https://www.cnblogs.com/preternatural/archive/2007/09/20/900536.html