咱們熟悉的四則表示式1+2,1+(23),1+(2+34)等等都是中綴表示法.
字尾表示式又叫逆波蘭表示式,它是由相應的語法樹的後序遍歷的結果得到的。
那麼計算機為什麼喜歡處理逆波蘭表示式,因為給出一串包含數字和操作符的時候,
計算機是按照順序來讀取的,採用逆波蘭就是遇到操作符時就取前面剛剛讀取的兩個數字進行計算,如:1 2 3 * + 4 5 / -
計算機從左至有遍歷時,讀取了1 2 3 後遇到操作符* 就取前面兩個數字即 2 3再相乘得到6,再把值放回,又遇到了加號時 把1和6進行操作…這樣操作下來計算機就不用考慮優先順序的問題,所以為什麼要用到逆波蘭表示式,
我將給出下面兩段**,計算和轉換為逆波蘭
1.使用者輸入中綴表示式,轉化為逆波蘭表示式
2.已知逆波蘭表示式,求計算結果
//使用者輸入中綴表示式子,轉化為逆波蘭表示式
#include
#include
#include
#define ok 1
#define error 0
#define stack_init_size 2
#define stackincrement 3
#define maxbuff 10
typedef
int status;
typedef
char selemtype;
//這裡定義的是char型別
typedef
struct
sqstack;
status stackinit
(sqstack *s)
void
push
(sqstack *s,selemtype e)
s->top = s->base + s->stacksize;
s->stacksize +
= stackincrement;}*
(s->top)
= e;
s->top++;}
void
pop(sqstack *s,selemtype *e)
*e =*--
(s->top);}
intstacklength
(sqstack *s)
intmain()
elseif(
')'==c)
}elseif(
'+'==c||
'-'==c)
else
else
}while
('('
!=e&&
stacklength
(&s));
push
(&s,c);}
}elseif(
'*'==c||
'/'==c||
'('==c)
else
scanf
("%c"
,&c);}
while
(stacklength
(&s)
)return0;
}/*====test:====
請輸入中綴表示式,以#作為結束標誌!
1+(2-3*4)-10/6#
1234*-+106/-
*/
//已知逆波蘭表示式,計算結果,定義的selemtype型別與上面不一樣
#include
#include
#include
#define ok 1
#define error 0
#define stack_init_size 2
#define stackincrement 3
#define maxbuff 10
typedef
int status;
typedef
double selemtype;
//這裡定義的是double型別
typedef
struct
sqstack;
status stackinit
(sqstack *s)
void
push
(sqstack *s,selemtype e)
s->top = s->base + s->stacksize;
s->stacksize +
= stackincrement;}*
(s->top)
= e;
s->top++;}
void
pop(sqstack *s,selemtype *e)
*e =*--
(s->top);}
intstacklength
(sqstack *s)
intmain()
scanf
("%c"
,&c);if
(c==
' ')
}switch
(c)scanf
("%c"
,&c);}
printf
("計算結果為:");
pop(
&s,&d)
;printf
("%f\n"
,d);
return0;
}/*====test:====
請輸入字尾表示式(資料可為浮點型),
資料和操作符以空格隔開,
和以#作為結束標誌..
1 2 3 4 * - + 10 6 / -#
轉化為十進位制結果為:-9.166667
*/
關於c++篇————波蘭式、逆波蘭式與表示式求值 波蘭表示式和逆波蘭表示式(棧)
中綴表示式如1 2 2 1 其運算子一般出現在運算元之間,因此稱為中綴表示式,也就是大家程式設計中寫的表達 式。編譯系統不考慮表示式的優先級別,只是對表示式從左到右進行掃瞄,當遇到運算子時,就把其前面的兩 個運算元取出,進行操作。為達到上述目的,就要將中綴表示式進行改寫,變為字尾表示式 如上面的表示...
波蘭表示式 逆波蘭表示式
中綴表示式是最常見的運算表示式,如 3 5 2 6 1 波蘭表示式又稱為字首表示式,它是由中綴表示式經過一定的方式轉換來的 比如中綴表示式為 3 5x 2 6 1 對應的字首表示式為 3 x 5 2 6 1 對於中綴表示式從右向左遍歷轉換為字首表示式,中途要是用棧進行儲存 轉換規則如下 波蘭表示式 ...
棧和逆波蘭表示式
1 2,1 3 2,1 3 2 1 3 這些就是中綴表示式,就是我們 平時經常見到的形式,先算加減再算乘除,有括號的先算括號裡面的,沒有括號按照優先順序順序進行計算。但是,計算機處理中綴表示式卻並不方便,因為沒有一種簡單的資料結構可以方便從乙個表示式中間抽出,一部分算完結果,再放進去,然後繼續後面的...