⑴ 表達式a*(b+C)-d的後綴表達式什麼 什麼叫中綴和後綴
根據所給表達式(其實正常的都是中綴表達式)可以構造二叉樹
—
/ \
* d
/ \
a +
/ \
b c
中綴表達式就是中序遍歷a*(b+c)-d
後綴表達式就是後續遍歷abc+*d-
前綴表達式就是前序遍歷-*a+bcd
⑵ 關於數據結構(Pascal)中綴表達式轉後綴表達式
var
ni,tuo:array[0..10000] of char; {ni是描述入棧,tuo是描述出棧}
nd,td,i,j,k,l:longint; {nd是ni的棧頂,td是tuo的棧頂}
tp:char; {tp讀入字元}
fh:array[0..3,1..2] of char; {fh用於判斷符號的優先順序}
function fhpd(ch:char):integer; {判斷符號優先順序}
var i,j:integer;
begin
for i:=0 to 2 do
for j:=1 to 2 do
if ch=fh[i,j] then exit(i);
exit(-1);
end;
begin
fillchar(ni,sizeof(ni),' ');
fillchar(tuo,sizeof(tuo),' ');
fh[1,1]:='+';fh[1,2]:='-';fh[2,1]:='*';fh[2,2]:='/';fh[0,1]:='('; {全部初始化}
read(tp);
while tp<>'.' do {當讀入「.」說明中綴表達式讀入完畢}
begin
if (tp=')') then {如果是『)』就將最近的一個『(』之間的符號,全部倒入tuo中,並將『(』和『)』去掉}
begin
while ni[nd]<>'(' do
begin
inc(td);
tuo[td]:=ni[nd];
ni[nd]:=' ';
if not(nd=1) then dec(nd); {防止棧底溢出}
end;
ni[nd]:=' '; {去掉『(』}
dec(nd);
end
else begin
if (tp in ['0'..'9']) then begin inc(td);tuo[td]:=tp;end else {如果是數字,則之間置入tuo中}
begin
if (ni[1]=' ')and(fhpd(tp)<>-1) then begin nd:=1;ni[nd]:=tp; end else {如果棧為空}
begin
if (ni[1]<>' ')and(fhpd(tp)<>-1) then {如果棧不為空,且tp為合法符號}
begin
if ((fhpd(tp)>fhpd(ni[nd]))or(tp='(')) then {如果tp大於ni的棧頂符號,或者tp是『(』}
begin
inc(nd);
ni[nd]:=tp; {直接置入ni棧中}
end
else
begin
while (nd<>0)and(not((fhpd(tp)>fhpd(ni[nd])))) do
{如果tp小於ni的棧頂符號,就將大於tp的符號倒入tuo中,直到ni的棧頂小於等於tp,就將tp加入ni}
begin
inc(td);
tuo[td]:=ni[nd];
dec(nd);
end;
inc(nd);
ni[nd]:=tp;
end;
end;
end;
end;
end;
read(tp);
end;
while nd<>0 do {最後將所用ni棧中的符號全部按照正規操作模式,倒入tuo中}
begin
inc(td);
tuo[td]:=ni[nd];
dec(nd);
end;
for i:=1 to td do write(tuo[i],' '); writeln; {從tuo的棧底開始輸出字元}
readln;readln;
end.
⑶ 什麼是前綴表達式,中綴表達式,後綴表達式
前綴就是運算符在兩個操作數的前面,其他已此類推。
比如,+
A
B
屬前綴
咱們平常使用的屬中綴比如
A
+
B
後綴自然就是
A
B
+
⑷ 數據結構 前綴表達式 中綴表達式 後綴表達式各是什麼啊 怎麼相互轉化呢 求詳細解釋 謝謝!
例如要表達3+5:
+ 3 5
3+5
3 5 +
分別是前綴、中綴、後綴表達式。前綴、中綴、後綴是指運算符號所放位置的差異!
⑸ 數據結構中綴式中綴表達式改後綴表達式並求值
搞兩個棧,一個存數字,一個存符號,處理一下優先順序就可以了。
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<string>
int a[10][10]={{3,2,2,3,3},{3,3,2,3,3},{2,2,2,1,0},{3,3,0,3,3},{2,2,2,0,1}};
char t[100];
using namespace std;
struct node
{
int h;
char c;
node *p;
};
int pd(char ch)
{
if((ch=='+')||(ch=='-'))return 0;
if((ch=='*')||(ch=='/'))return 1;
if(ch=='(')return 2;
if(ch==')')return 3;
if(ch=='@')return 4;
}
int main()
{
node *r,*q;
int i,l,k=0,v,w,o;
string s;
cin>>s;
l=s.length();
s[l]='@';
l++;
q=new node;
q->c='@';
for(i=0;i<=l-1;i++){
if((s[i]>='0')&&(s[i]<='9')){
t[k]=s[i];
k++;
if((s[i+1]<'0')||(s[i+1]>'9')){
t[k]=' ';
k++;
}
continue;
}
w=pd(s[i]);
v=pd(q->c);
switch (a[v][w]){
case 1:
q=q->p;
break;
case 2:
r=q;
q=new node;
q->c=s[i];
q->p=r;
break;
case 3:
r=q;
q=new node;
q->c=s[i];
q->p=r;
while(a[v][w]==3){
t[k]=q->p->c;
k++;
q->p=q->p->p;
v=pd(q->p->c);
w=pd(q->c);
}
if(a[v][w]==1)
q=q->p->p;
break;
}
}
q=new node;
for(i=0;i<=k-1;i++){
if(((t[i]>'9')||(t[i]<'0'))&&(t[i-1]>='0')&&(t[i-1]<='9')){
o=1;
v=i-1;
w=0;
while(t[v]>='0'){
w=w+o*(t[v]-'0');
o=o*10;
v--;
}
r=q;
q=new node;
q->h=w;
q->p=r;
}
switch(t[i]){
case '+':
q->p->h+=q->h;
q=q->p;
break;
case '-':
q->p->h-=q->h;
q=q->p;
break;
case '*':
q->p->h*=q->h;
q=q->p;
break;
case '/':
q->p->h/=q->h;
q=q->p;
break;
}
}
cout<<q->h;
return 0;
}
⑹ 寫出對應的中綴算術表達式
(24+8)*3/4*(10-7)
⑺ 數據結構的一道題:中綴表達式A-(B+C/D)*E的後綴形式是什麼為什麼
後綴表達式是把運算符號放在操作數後面
ABCD/+E*-
計算方法是:
1.把表達式中的每個操作都加括弧,(A-((B+(C/D))*E))
2.把運算符號移到對應括弧後面:
(A((B(CD)/)+)E)*)-
3.去掉括弧:
ABCD/+E*-
⑻ 數據結構:表達式的前綴表達式和後綴表達式
A ^ B * C - D + E / (F / (G + H))
簡單說下解題思路,僅供參考。
首先找到前兩個操作數,在這里是AB,取離它最近的那個符號,是^,組合起來,作為一項,這樣表達式變成 + - * (A ^ B) C D / E / F + G H
繼續這樣,前兩個操作數是(A ^ B)和C,符號是*,合並作為一項,變成 + - (A ^ B * C) D / E / F + G H
繼續,變成 + (A ^ B * C - D) / E / F + GH
這個時候,+的一個操作數是(A ^ B * C - D),另一個操作數是第一個/後邊的結果
然後我們看怎麼解 / E / F + GH,還是這樣,被除數是E,除數是 / F + GH
/ F + GH的被除數是F,除數是 + G H, 即為(G + H), 這項是F / (G + H)
回到上一步,/ E / F + G H是E / (F / (G + H))
再往上回一步,得到整個表達式。
抽象一點,大概是這樣:對於一個表達式,找到第一個操作數,它肯定是它左邊緊挨著的那個運算符的左值(比如這道題里的A是第一個操作數,是^的左值)。操作數右邊如果是操作數,那麼肯定是之前找到的操作符的右值,如果是操作符,重復這個過程
2. 先把中綴表達式轉化為後綴。這個方法到處都能搜到。
後綴表達式 3 2 * 4 2 2 * + 6 3 * - ^ 5 -
這個求值過程應該是沒有運算符棧的
⑼ 表達式求值 數據結構中綴表示轉換為後綴表達式
我們在數學中常見的計算式,例如2+(3*4)叫做中綴表達式。表達式中涉及到了多個運算符,而運算符之間是有優先順序的。計算機在計算並且處理這種表達式時,需要將中綴表達式轉換成後綴表達式,然後再進行計算。 中綴表達式轉後綴表達式遵循以下原則: 1.遇到操作數,直接輸出; 2.棧為空時,遇到運算符,入棧; 3.遇到左括弧,將其入棧;
4.遇到右括弧,執行出棧操作,並將出棧的元素輸出,直到彈出棧的是左括弧,左括弧不輸出;
5.遇到其他運算符'+''-''*''/'時,彈出所有優先順序大於或等於該運算符的棧頂元素,然後將該運算符入棧;
6.最終將棧中的元素依次出棧,輸出。
經過上面的步驟,得到的輸出既是轉換得到的後綴表達式。
⑽ 簡單的解釋下後綴表達式是什麼
舉個例子吧:
對於算式1*2+(2-1)來說,這是一個中綴表達式(就是平時計算用的式子)
轉化為後綴表達式的過程為:
先說統一的過程:
1.從左到右依次讀取算式的一個字元
2.如果讀到括弧,則跳過,到下一個字元
3.如果讀到的字元是數字,則直接輸出到一個結果字元串的末尾(這個結果字元串到最後就是要的後綴表達式)
4.如果讀到的是運算符,則要將此運算符入棧
(1) 若棧空,則直接入棧;
(2) 若棧不空則要判斷棧頂運算符的優先順序:
<1>若棧頂運算符的優先順序低於要入棧的運算符,直接入棧
<2>若棧頂運算符的優先順序高於要入棧的運算符,要將棧頂位置的高優先順序的運算符出棧,出棧的運算符輸 出到結果字元 串的末尾.
,直到棧頂運算符優先順序低於要入棧的運算符為止.(實際上就是要保證棧中的運算符優先順序從棧頂到 棧底是依次從高到低的)
5.依次按上述方式讀取,直到將次中綴表達式讀完.最後的結果就保存在這個結果字元串.
6.最後將棧中還有的運算符出棧,加入到結果字元串中去.就得到了後綴表達式
舉例說明1*2+(2-1)
設結果字元串String result="";//開始為空
設存儲運算符的棧為stack=空//開始為空,從左到右為棧底和棧頂
第一個字元為1,直接加入到結果字元串result=="1";
第二個字元為*,棧為空,直接入棧.stack=*
第三個字元為2,加入到結果字元串result=="12";
第四個字元為+.棧不空,入棧.棧頂運算符*優先順序高於要入棧運算符+,故*先出棧,加入到結果字元串
result=="12*";然後入棧stack=+
第五個字元為(直接跳過
第六個字元為2,加入結果字元串result=="12*2"
第七個字元為-.棧不空,入棧,棧頂運算符+優先順序高於要入棧運算符-,故+先出棧,加入到結果字元串
result=="12*2+";然後入棧stack=-
第七個字元為1,加入結果字元串result=="12*2+1"
第八個字元為).跳過,
到此為止中綴表達式讀取完畢
將棧里的運算符依次出棧加入結果字元串
result=="12*2+1-"得到了最終的後綴表達式
第二個問題:後綴表達式的計算
1.將後綴表達式從左到右依次讀取
2.如果讀到數字,直接入棧
3.如果讀到運算符,則將棧頂的兩個數字出棧,和此運算符做運算
注意: 先出棧的數為減數,後出棧的為被減數(除法類似)
將此計算的結果再壓入棧中
4.重復上述步驟,最終的運算結果就存在棧里
舉例說明:上面得到的後綴表達式:12*2+1-
設棧為stack
第一個字元1,入棧stack=1
第二個字元2,入棧stack=12
第三個字元*.棧元素出棧做運算1*2得到2,再入棧stack=2
的四個字元2,入棧stack=22
第五個字元+,棧元素出棧做運算2+2得到4,再入棧stack=4
第六個字元1,入棧stack=41
第七個字元-,棧元素出棧做運算4-1得到3,再入棧stack=3
到此為止,後綴表達式讀取完畢,棧中就存儲最終結果3
你可以算算和原始的中綴表達式1*2+(2-1)結果相同吧~