棧的應用(表示式求值)

2021-09-27 12:07:50 字數 1628 閱讀 2550

首先我們日常見到的表示式是下面這個樣子的

((1+2)*5+1)/4;

諸如此類的式子叫做中綴表示式這種表示式是基於人的思維方式

運算符號在兩個要運算的數字中間,但是這並不利於計算機的計算,

計算機只需要知道要運算那兩個數字和運算符號就好,

所以我沒們在這裡可以利用字尾表示式(也稱逆波蘭式)字尾表示式子

是如下樣子

1#2+#5#*1+#4/ // #用於分隔兩個數字

那麼寫成這樣有什麼優點呢?

(1).操作符位於運算元之後;

(2).沒有括號;

(3).操作符沒有優先順序;

那麼我們怎樣將乙個中綴表示式轉化為字尾表示式呢?

在這裡我們就需要用到棧的特性(**先出)

開闢:操作符棧 stackoc、結果字串ans;

(1).運算元壓到結果字串;操作符玉如操作符棧;

(2).當待壓入操作符棧的操作符優先順序大於棧頂操作符時,直接入棧;

若小於等於棧頂操作符的話,棧頂操作符加入到結果字串後面,直到遇到前括號『(』或者棧頂操作符優先順序小於待入棧操作符,最後待入棧操作符入棧;

(3).如果時前『(』直接入棧;

(4).如果是後『)』,將棧中操作符依次彈出並壓入結果字串,並彈出前『(』不加入結果字串;

根據以上四個步驟,得到的就是字尾表示式;

實現**

#include#include#include#include#includeusing namespace std;

char ans[5000],s[1100];//ans結果字串,s原串;

int cmp(char c)

double subans(double x , double y , char c)

int main(void)

oc.push(s[i]);}}

else if(s[i] == '(')

else if(s[i]==')')

oc.pop();

}else if(s[i] == '=') }}

//ans[k++] = '=';

//得到字尾表示式 ans;

// printf("\n");

//puts(ans);

//字尾表示式求值;

int pos = 0;

for(int i = 0; i < k; i++)

double k = 1, sum1 = 0, sum2 = 0;

for(int j = i + pos - 1; j >= i; j--)

else if(ans[j] == '.')

}sum2 += sum1;

on.push(sum2); //報運算元壓入運算元棧中;

i += pos - 1;

}else if (ans[i] == '+'||

ans[i] == '-'|| ans[i] == '*'|| ans[i] == '/')

}printf("%.2lf\n",on.top()); //處理運算元棧中只有乙個運算元;

}return 0;

}

棧應用 表示式求值

include stdafx.h include using namespace std const int explenght 20 const int stack init size 20 const int stack incrment 10 templateclass stack stack...

棧應用 表示式求值

include include define length 100 初始分配棧的長度 define add len 10 棧長增量 typedef struct 定義字元棧 sqstack void initstack sqstack s 初始化乙個棧 void push sqstack s,int...

表示式求值 棧的應用

表示式求值 西西設計的機械人卡多掌握了加減法運算以後,最近又學會了一些簡單的函式求值,比如,它 知道函式min 20,23 的值是20 add 10,98 的值是108等等。經過訓練,西西設計的機械人卡多 甚至會計算一種巢狀的更複雜的表示式。假設表示式可以簡單定義為 1.乙個正的十進位制數 x 是乙...