纯娱乐用的代码,效率很低!
Item类用来表示四则表达式的每个项,包括计算数和计算符;Expression类用来
表示整个四则表达式;Calculate类用来计算Expression。
四则表达式通过字符串形式输入,程序通过扫描字符串,分析表达式,然后计算出结果,并给出计算的每个步骤。

该程序是用来学习用,体会面向对象编程的思路,学习STL的使用,并无实际价值,有兴趣的朋友可将其继续完善。

Item.h
enum ItemType{UNKNOWN_ITEM_TYPE, OPERAND, ADDITION, SUBTRATION, MULTIPLICATION, DIVISION, LEFT_BRACKET, RIGHT_BRACKET};


bool IsNumeral(char c);

class Item  
{
public:
    Item();
    virtual ~Item();

    
// 返回值:返回item的长度。0表示创建失败。
    
int CreateItem(const char* szExpression, int iIndex);
    
int GetType() const;
    
double ToDouble() const;

private:
    char
*    m_pcItem;
    
int      m_iSize;
    ItemType m_Type;
};

Item.cpp
#include "Item.h"
#include 
<string>

//test
#include 
<iostream>

using namespace std;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

bool IsNumeral(char c)
{
    
if ((('0'<=c) && ('9' >= c)) || ('.' == c))
        return true;
    return 
false;
}


Item::Item()
{
    m_pcItem 
= 0;
    m_iSize  
= 0;
    m_Type   
= UNKNOWN_ITEM_TYPE;
}

Item::~Item()
{
    delete m_pcItem;
}

int Item::CreateItem(const char* szExpression, int iIndex)
{
    
int count = 0;
    
for (int i=0; ;++i)
    {
        char c 
= szExpression[iIndex+i];
        
if (c == '\0')
        {
            break;
        }

        
if (IsNumeral(c))
        {
            
if (m_Type == UNKNOWN_ITEM_TYPE)
            {
                m_Type 
= OPERAND;
            }
            
else if (m_Type != OPERAND)
            {
                break;
            }

            
++count;
        }
        
else
        {
            
if (m_Type == UNKNOWN_ITEM_TYPE)
            {
                switch(c)
                {
                
case '+':
                    m_Type = ADDITION;
                    break;
                
case '-':
                    m_Type = SUBTRATION;
                    break;
                
case '*':
                    m_Type = MULTIPLICATION;
                    break;
                
case '/':
                    m_Type = DIVISION;
                    break;
                
case '(':
                    m_Type = LEFT_BRACKET;
                    break;
                
case ')':
                    m_Type = RIGHT_BRACKET;
                    break;
                }
            }
            
else
                break;
                
            
++count;
            break; 
// 默认操作符都只占一位
        }
    }

    
if (m_pcItem != 0)
    {
        delete m_pcItem;
        m_pcItem 
= 0;
    }

    
if (count > 0)
    {
        m_pcItem 
= new char[count+1];
        memcpy(m_pcItem, 
&szExpression[iIndex], count);
        m_pcItem[count] 
= '\0';
        //test
        cout 
<< "createitem:" << m_pcItem << endl;
    }

    m_iSize 
= count;

    return count;
}

int Item::GetType() const
{
    return m_Type;
}

double Item::ToDouble() const
{
    return atof(m_pcItem);
}

Expression.h
#include "Item.h"
#include 
<vector>
#include 
<stack>

using namespace std;

class Expression  
{
public:
    Expression(
const char* szExpression, int size);
    virtual ~Expression();

    
const vector<Item*>& GetItems(); 

private:
    bool   Scan();
    void   TrimSpace();

    char
* m_szExpression;
    
int   m_iSize;
    vector
<Item*>  m_pItems;
};

Expression.cpp
#include "Expression.h"
#include 
<stack>
using namespace std;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////


Expression::Expression(
const char* szExpression, int size)
{
//    m_szExpression = const_cast<char*>(szExpression);
    m_szExpression 
= new char[size];
    memcpy(m_szExpression, szExpression, size);
    m_iSize 
= size;
    TrimSpace();
    Scan();
}

Expression::~Expression()
{
    
int count = m_pItems.size();
    
for (int i=0; i<count; ++i)
    {
        delete m_pItems[i];
    }

    delete [] m_szExpression;
}

void Expression::TrimSpace()
{
    
for (int i=0; i<m_iSize; ++i)
    {
        
if (m_szExpression[i] == ' ')
        {
            
for (int j=i+1; j<m_iSize; ++j)
            {
                m_szExpression[j
-1= m_szExpression[j];
                
if (m_szExpression[j] == '\0')
                {
                    break;
                }
            }
        }
    }
}

bool Expression::Scan()
{
    
int   iIndex = 0;
    
int   iCount = 0;
    
for (;iIndex<m_iSize;)
    {
        Item
* pItem = new Item();
        iCount 
= pItem->CreateItem(m_szExpression, iIndex);

        
if (iCount > 0)
        {
            m_pItems.push_back(pItem);
            iIndex 
+= iCount;
        }
        
else
            return 
false;
    }

    return 
true;
}

const vector<Item*>& Expression::GetItems()
{
    return m_pItems;
}

Calculate.h
#include "Item.h"
#include 
<vector>
#include 
<stack>

using namespace std;

class Calculate  
{
    class Process
    {
    
public:
        Process();
        virtual ~Process();

        void   Push(
const Item* item);
        void   Push(
double operand);
        
double Result();
        
    protected:
    
private:
        void  Compute(
int type);
        void  Flush(
int prior);

        stack
<double> m_Operands;
        stack
<int>    m_Operations;
    };

public:
    Calculate();
    virtual ~Calculate();

    
double Compute(const vector<Item*>& items);

};

Calculate.cpp
#include "alculate.h"

//test
#include 
<iostream>
using namespace std;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

int  Priority[] = {00112200};

Calculate::Calculate()
{

}

Calculate::~Calculate()
{

}

double Calculate::Compute(const vector<Item*>& items)
{
    
int    ItemCount = items.size();
    
int    type      = 0;
    
double Result    = 0;
    stack
<Process> processStack;
    processStack.push(Process());
    
for (int i=0; i<ItemCount; ++i)
    {
        type 
= items[i]->GetType();
        
if (type == LEFT_BRACKET)
        {
            processStack.push(Process());
            continue;
        }
        
else if (type == RIGHT_BRACKET)
        {
            Result 
= processStack.top().Result();
            processStack.pop();
            processStack.top().Push(Result);
            continue;
        }
        
        processStack.top().Push(items[i]);
    }

    Result 
= processStack.top().Result();

    return Result;
}


//////////////////////////////////////////////////////////////////////////
// implement of class Process
//////////////////////////////////////////////////////////////////////////

Calculate::Process::Process()
{
}

Calculate::Process::~Process()
{
}

void Calculate::Process::Push(
const Item* item)
{
    
int type = item->GetType();
    
if (type == OPERAND)
    {
        m_Operands.push(item
->ToDouble());
    }
    
else
    {
        
if (!m_Operations.empty())
        {
            
if (Priority[type] <= Priority[m_Operations.top()])
            {
                Flush(Priority[type]);
            }
        }

        m_Operations.push(type);
    }
}

void Calculate::Process::Push(
double operand)
{
    m_Operands.push(operand);
}

void Calculate::Process::Flush(
int prior)
{
    
int type = 0;
    
while (!m_Operations.empty())
    {
        type 
= m_Operations.top();

        
if (prior <= Priority[type])
        {
            Compute(type);
            m_Operations.pop();
        }
        
else
        {
            break;
        }
    }
}

void Calculate::Process::Compute(
int type)
{
    
double operand1 = 0;
    
double operand2 = 0;
    
if (!m_Operands.empty())
    {
        operand2 
= m_Operands.top();
        m_Operands.pop();
    }
    
else
    {
        
//异常
    }

    
if (!m_Operands.empty())
    {
        operand1 
= m_Operands.top();
        m_Operands.pop();
    }
    
else
    {
        
//异常
    }

    
double result;
    switch(type)
    {
    
case ADDITION:
        result 
= operand1 + operand2;
        
//test
        cout 
<< operand1 << "+" << operand2 << "=" << result << endl;
        break;
    
case SUBTRATION:
        result 
= operand1 - operand2;
        
//test
        cout 
<< operand1 << "-" << operand2 << "=" << result << endl;
        break;
    
case MULTIPLICATION:
        result 
= operand1 * operand2;
        
//test
        cout 
<< operand1 << "*" << operand2 << "=" << result << endl;
        break;
    
case DIVISION:
        result 
= operand1 / operand2;
        
//test
        cout 
<< operand1 << "/" << operand2 << "=" << result << endl;
        break;
    default:
        
//异常
        break;
    }

    m_Operands.push(result);
}

double Calculate::Process::Result()
{
    Flush(
0);
    return m_Operands.top();
}

main.cpp

#include 
<iostream>
#include 
<string>

#include 
"Expression.h"
#include 
"alculate.h"

using namespace std;

void main()
{
    cout 
<< "hellow world" << endl;

    char pBuffer[
4096];
    cin.getline(pBuffer, 
4096);

    Expression expres(pBuffer, 
4096);
    Calculate computor;
    cout 
<< computor.Compute(expres.GetItems()) << endl;
}