一般情況下表達(dá)式是由操作數(shù)和運(yùn)算符組成,例如算數(shù)表達(dá)式中通常將運(yùn)算符放在兩個(gè)操作數(shù)中間,譬如a+b的形式,這種形式稱為中綴表達(dá)式,那么問題來了,是否有后綴表達(dá),前綴表達(dá)式呢???
創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,提供網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì),網(wǎng)頁設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);可快速的進(jìn)行網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,是專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
對(duì),沒錯(cuò),這些后綴表達(dá),前綴表達(dá)式都是由波蘭數(shù)學(xué)家Jan Lukasiewicz提出來的
把運(yùn)算符寫在操作數(shù)之前,稱為波蘭表達(dá)式(Polish Expression)或前綴表達(dá)式(Prefix Expression),如+AB;
把運(yùn)算符寫在操作數(shù)之后,稱為逆波蘭表達(dá)式(Reverse Polish Expression)或后綴表達(dá)式(Suffix Expression),如AB+;
假如我們有一個(gè)表達(dá)式,應(yīng)該如何求它的值呢?在這里棧就派上用場了,由于操作數(shù)在操作符前邊,所以按順序遍歷這個(gè)表達(dá)式,遇到操作數(shù)的時(shí)候就進(jìn)棧,遇到操作符的時(shí)候就讓離操作符最近的兩個(gè)操作數(shù)出棧,并參加運(yùn)算,然后將運(yùn)算結(jié)果壓入棧中。過程如下圖所示:
要編寫逆波蘭表達(dá)式求解函數(shù),就要將一個(gè)逆波蘭式當(dāng)做一個(gè)數(shù)組去處理,而且這個(gè)數(shù)組應(yīng)該是一個(gè)結(jié)構(gòu)體數(shù)組,每個(gè)數(shù)組元素包含兩個(gè)內(nèi)容,一個(gè)是數(shù)組元素的類型(操作數(shù)類型還是操作符類型),一個(gè)是這個(gè)類型對(duì)應(yīng)的值。
今天就暫且實(shí)現(xiàn)一下后綴表達(dá)式吧,在這里運(yùn)用枚舉,能夠更清晰的表達(dá)哦
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<stack>
#include<assert.h>
using namespace std;
enum Type
{
OP_NUM,
OP_SYMBOL,
};
enum SYMBOL
{
ADD,
SUB,
MUL,
DIV,
};
//定義一個(gè)結(jié)構(gòu)體數(shù)組包括數(shù)組的類型和數(shù)組的值
struct Cell
{
Type _type;
int _value;
};
//逆波蘭表達(dá)式計(jì)算函數(shù)
int CountRNP(Cell a[],size_t size)
{
stack <int> s;
//若函數(shù)參數(shù)一定不能為空的條件下必須用斷言
assert(a);
for(size_t i=0;i<size;i++)
{//數(shù)組里邊的元素若為數(shù)值,則直接壓入棧中
if(a[i]._type==OP_NUM)
{
s.push(a[i]._value);
}
//若數(shù)組里邊的元素不是值,而是運(yùn)算符,則將離運(yùn)算符最近的兩個(gè)元素出棧,進(jìn)行運(yùn)算
else
{
int right=s.top();
s.pop();
int left=s.top();
s.pop();
switch(a[i]._value)
{
case ADD:
s.push(left+right);
break;
case SUB:
s.push(left-right);
break;
case MUL:
s.push(left*right);
break;
case DIV:
s.push(left/right);
break;
default:
break;
}
}
}
return s.top();
}
int main()
{
Cell a[]={{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}};
size_t size =sizeof(a)/sizeof(Cell);
cout<<CountRNP(a, size)<<endl;
system("pause");
return 0;
}
運(yùn)行結(jié)果:
網(wǎng)站題目:逆波蘭表達(dá)式的實(shí)現(xiàn)
文章路徑:http://chinadenli.net/article38/joispp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、動(dòng)態(tài)網(wǎng)站、App開發(fā)、域名注冊、網(wǎng)站營銷、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)