preternatural

计算算术表达式

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

posted on 2007-09-20 21:09  preternatural  阅读(257)  评论(1编辑  收藏  举报

导航