棧的應用 表示式求值

2021-09-01 16:22:52 字數 1964 閱讀 1949

一、

從原表示式求得字尾式

表示式存放在字元型陣列

str中,其字尾表示式存放在字元型陣列

exp中,轉換過程中用乙個字元型陣列

op作為棧。依次

處理字串str

中的每個

字元ch

,對於每乙個ch:

(1)若

ch為數字

,將其存放在

exp中。

(2)若

ch為左括弧「(」

,將其壓棧。

(3)若

ch為右括弧「)」

,將棧op中「(

」上面的操作符出棧並依次

存入exp

中,然後「(」

出棧。(4)若

ch為「

+」或「-」

,將op中「(

」上面的所有字元(

運算子)

依次出棧

並存入exp

中,然後將

ch入棧

op中。

(5)若

ch為「

*」或「/」

,將op

中的棧頂連續的「

*」或「/」

出棧並依次存入exp

中,然後將

ch入棧

op中。

(6)若

str掃瞄完畢

,將op

中的所有運算子依次刪除並存入

exp中,再將ch(

結束標誌

)存入陣列exp

中。

#include #include #define maxsize 10

typedef structstack;

void trans (const char *str, char *exp)

op.top--; //(出棧

break;

case '+':

case '-': //前面的運算必定都算完才算當前加減,故將棧中(前面的都出棧到exp中

while (op.top!=-1 && op.data[op.top]!='(')

op.top++;

op.data[op.top]=ch;

break;

case '*':

case '/': //前面的乘除必定都算完才算當前乘除,故將棧連續的乘除都出棧到exp中

while (op.top!=-1 && op.data[op.top]=='*' || op.data[op.top]=='/')

op.top++;

op.data[op.top]=ch;

break;

case ' ':

break; //過濾掉空格

default:

while (ch>='0' && ch<='9')

s--;

exp[e]='#'; //用#標識乙個數值串結束

e++;

} //switch

ch=str[s]; s++;

} //while

while (op.top!=-1)

exp[e]='\0'; //exp結束標識

} int main()stack;

float compvalue(char *exp)else

default:

d=0; //數值存放到d中

while (ch>='0' && ch<='9')

st.top++;

st.data[st.top]=d;

} //case

ch=exp[e];

e++;

} //while結束

return st.data[st.top];

} int main()

執行結果:

35.257141

棧應用 表示式求值

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 是乙...