設以『@』
字元作為結束符的中綴算術表示式已經儲存在s1字串中,轉換後得到的字尾算術表示式擬存於s2字串中。由中綴表示式轉換為字尾表示式的規則可知:轉換前後,表示式中的數值項的次序不變,而運算子的次序發生了變化,由處在兩個運算物件的中間變為處在兩個運算物件的後面,同時去掉了所有的括號。為了使轉換正確,必須設定乙個運算子棧,並在棧底放入乙個特殊算符,假定為』@』
字元,讓它具有最低的運算子優先順序,假定為數值0,此棧用來儲存掃瞄中綴表示式得到的暫不能放入字尾表示式中的運算子,待它的兩個運算物件都放入到字尾表示式以後,再令其出棧並寫入到字尾表示式中。
把中綴表示式轉換為字尾表示式演算法的基本思路是從頭到尾地掃瞄中綴表示式中的每個字元,對於不同型別的字元按不情況進行處理。若遇到的是空格則認為是分隔符,不需要進行處理;若遇到的是數字或小數點,則直接寫入到s2中,並在每個數值的最後寫入乙個空格;若遇到的是左括號,則應把它壓入到運算子棧中,待以它開始的括號內的表示式轉換完畢後再出棧;若遇到的是右括號,則表明括號內的中綴表示式已經掃瞄完畢,把從棧底直到儲存著的對應左括號之間的運算子依次退棧並寫入s2串中;若遇到的是運算子,當該運算子的優先順序大於棧頂運算子的優先順序(加減運算子的優先順序設定為1,乘除運算子的優先順序設定為2,在棧中儲存的特殊運算子』@』
和』(』的優先順序設定為0)時,表明該運算子的後乙個運算物件還沒有被掃瞄並放入到s2串中,應把它暫存於運算子棧中,待它的後乙個運算物件從s1串中讀出並寫入到s2串中後,再另其出棧並寫入s2串中;若遇到的運算子的優先順序小於等於棧頂運算子的優先順序,這表明棧頂運算子的兩個運算物件已經被儲存到s2串中,應將棧頂運算子退棧並寫入到s2串中,對於新的棧頂運算子仍繼續進行比較和處理,直到被處理的運算子的優先順序大於棧頂運算子的優先順序為止,然後另該運算子進棧即可。
按照以上過程掃瞄到中綴表示式結束符』@』
時,把棧中剩餘的運算子依次退棧並寫入到字尾表示式中,再向s2寫入表示式結束符』@』
和字串結束符』』,整個轉換過程就處理完畢,在s2中就得到了轉換成的字尾表示式。
例如,設中綴算術表示式s1為:10+(18+9*3)/15-6@,使用的運算子棧用r表示,則轉換過程如下:
(1)開始時存放字尾表示式的字串s2為空,r中壓入有』@』
算符,它具有最低的優先順序0:
@
(2)當掃瞄到s1中的左括號時,s2和r中的資料變化如下:
1 0
@ + (
(3)當掃瞄到s1中的數值3時,s2和r中的資料變化為:
1 0 1 8 9 3
@ + ( + *
(4)當掃瞄到s1中的右括號時,s2和r變為:
1 0 1 8 9 3 * +
@ +
(5)當掃瞄到s1中的數值15時,s2和r又變為:
1 0 1 8 9 3 * + 1 5
@ + /
(6)當掃瞄到s1中的』@』
字元時,s2和r為:
1 0 1 8 9 3 * + 1 5 / + 6
@ -
(7)當整個處理過程結束後,r棧為空,s2為:
1 0 1 8 9 3 * + 1 5 / + 6 - @ ù
完整**如下:
#include
#include
#include
#include"stack.h"
#define max 30
int precedence(char ch)
void change(char *s1,char *s2)
s2[j++]=ch;
ch=s1[++i];
one=0;
}else if(ch=='(')
else if(ch==')')
else if(ch=='+'||ch=='-'||ch=='*'||ch=='/')
push(ch,s);
ch=s1[++i];
one=1;}}
while(stackempty(s)!=1)
s2[j]='/0';
}int main()
其中:stack.h如下:
#ifndef stack_h
#define stack_h
#include
#include
typedef struct astack *stack;
typedef struct astack
astack;
stack newempty(int size)
int stackempty(stack s)
int stackfull(stack s)
int peek(stack s)
void push(char x,stack s)
else
s->data[++s->top]=x;
}int pop(stack s)
else
return s->data[s->top--];
}stack newstack(int size)
printf("/n");
}#endif
中綴表示式轉為字尾表示式
定義 中綴表示式是乙個通用的算術或邏輯公式表示方法,操作符是以中綴形式處於運算元的中間 例 3 4 中綴表示式是人們常用的算術表示方法。字尾表示式,又稱逆波蘭式,指的是不包含括號,運算子放在兩個運算物件的後面,所有的計算按運算子出現的順序,嚴格從左向右進行 不再考慮運算子的優先規則 規則轉換過程需要...
中綴表示式轉為字尾表示式
把中綴表示式轉換為字尾表示式。基本思路是。每乙個符號最開始都是懸而未決的。是否簡單的把符號放到左右數字的後面,都是由後面的符號決定。所以先插入第乙個符號。後面拿到的符號必須和之前的符號 棧頂 比較,棧頂和新符號平級或者棧頂更優先,那麼棧頂符號插入字尾表示式。public static void ma...
中綴表示式轉為字尾表示式 棧
題目 給乙個中綴表示式 即標準形式的表示式 列印該表示式的字尾表示式。中綴表示式最大的不同就是去掉了表示運算子優先順序的括號。運算元為26個小寫或大寫的英文本母 注意不包括數字和其他字元 操作符為 一共八個。具體見例子見下圖 如下 include include include using name...