一、問題概述:
人們經常書寫的數學表達式屬于中綴表達式,今天要解決的是,后綴表達式的求解問題。
如下圖分別為舉例的中綴表達式和后綴表達式:
二、解決思路
我們用棧存儲后綴表達式中的數據部分,當遇到操作符時就取出棧中的棧頂兩個元素,檢測操作符的類型,并進行相應的計算(這里要注意的是,對于除法運算,棧頂的兩個元素的位置得區分)。
如下所示:
三、實現代碼
//Expression.h
#pragma once
#include<stack>
#include<assert.h>enum Type
{OP_SYMBOL,OP_NUM,ADD,SUB,MUL,DIV
};struct Cell
{Type _type;int _value;
};void FunTest()
{Cell RPN[] = {{OP_NUM,12},{OP_NUM,3},{OP_NUM,4},{OP_SYMBOL,ADD},{OP_SYMBOL,MUL},{OP_NUM,6},{OP_SYMBOL,SUB},{OP_NUM,8},{OP_NUM,2},{OP_SYMBOL,DIV},{OP_SYMBOL,ADD}};stack<int> s;for(size_t i = 0; i < sizeof(RPN)/sizeof(RPN[0]);++i){if(RPN[i]._type == OP_NUM){s.push(RPN[i]._value);}else if(RPN[i]._type == OP_SYMBOL){int second = s.top();s.pop();int first = s.top();s.pop();switch(RPN[i]._value){case ADD:s.push(first+second);break;case SUB:s.push(first-second);break;case MUL:s.push(first*second);break;case DIV:s.push(first/second);break;default:assert(false);}}else{assert(false);}}cout<<s.top()<<endl;
}
//Expression.cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#include"Expression.h"int main()
{FunTest();return 0;
}
后綴表達式就說到這里嘍,有需要改進得地方,歡迎提出寶貴意見哦。