算術表示式的轉換

2021-08-24 23:08:08 字數 2146 閱讀 8192

time limit: 1000 ms memory limit: 65536 kib

submit

statistic

discuss

problem description

小明在學習了資料結構之後,突然想起了以前沒有解決的算術表示式轉化成字尾式的問題,今天他想解決一下。

因為有了資料結構的基礎小明很快就解出了這個問題,但是他突然想到怎麼求出算術表示式的字首式和中綴式呢?小明很困惑。聰明的你幫他解決吧。

input

輸入一算術表示式,以\'#\'字元作為結束標誌。(資料保證無空格,只有一組輸入)

output

輸出該表示式轉換所得到的字首式 中綴式 字尾式。分三行輸出,順序是字首式 中綴式 字尾式。

sample input

a*b+(c-d/e)*f#
sample output

+*ab*-c/def

a*b+c-d/e*f

ab*cde/-f*+

hint

source

思路:棧的存放並不是一下子把所有的東西都放進去,而是邊操作邊存放的

1.對於中綴表示式向字首表示式的轉換:需要兩個棧,乙個棧儲存字母,另乙個棧儲存運算子;並且字首表示式是從右向左開始的(字尾表示式是從左向右開始的)當遇到字母的時候,進棧1,當遇到運算子的時候,進棧2,這時候進棧2是有條件的:1.如果當前的運算子是加減,而棧2的top是乘除,這時候要把棧2的top元素轉移到棧1中(注意這時候沒有相等的情況,和字尾表示式不一樣,字尾表示式還有兩種情況是當前的元素是加減,棧頂的元素也是加減;當前的元素是乘除,棧頂的元素也是乘除)然後當前的元素進棧2;2.當當前的元素是左括號的時候要去找右括號,除了這兩個括號之外,把他們之間的元素都放到棧1裡面(字尾表示式是當前是左括號,去找右括號,並且左右括號之間的元素是輸出,而不是進入另乙個棧);3.其他的情況入棧2就行了;之後把棧2裡面的元素都給清到棧1裡面,最後把棧1的元素都輸出即可; 

中綴表示式向字尾表示式轉換:只需要乙個棧,存放運算子;當遇到字母就輸出,當遇到運算子就進棧,這裡的進棧是有條件的:1.如果當前的元素是加減,棧頂的元素是乘除,棧頂元素先輸出,當前元素入棧;或者當前的元素是加減,棧頂的元素也是加減;或者當前的元素是乘除,棧頂的元素也是乘除;同樣的操作;2.如果當前的元素是右括號,就要去棧裡面找左括號 ,並且輸出除了左右括號之外的所有的運算子;3.其他的情況就是入棧了;最後把棧裡面的所有元素都輸出; 

2.對於字首表示式和字尾表示式的運算:字尾表示式:需要乙個棧存放運算元,遇到乙個運算子就要對棧頂元素和棧次元素進行操作,注意這裡的操作是棧次元素對棧頂元素進行加減乘除,之後top要退一位,最後輸出棧頂的值即可; 

字首表示式:是從右往左掃瞄運算元入棧,操作的時候是棧頂元素對棧次元素進行加減乘除的運算;最後輸出棧頂元素即可;

#include #include #include int main()

else if(a[i] == '+' || a[i] == '-')

else

}else if(a[i] == '*' || a[i] == '/')

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

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

top2--;}}

for(i = 1; i <= top2; i++)

for(i = top1; i >= 1; i--)

printf("\n");

for(i = 0; i < len - 1; i++)

}printf("\n");

int top = 0;

memset(b,0,sizeof(b));

for(i = 0; i < len - 1; i++)

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

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

top--;

}else if(a[i] == '+' || a[i] == '-')

top++;

b[top] = a[i];

}else if(a[i] == '*' || a[i] == '/')

else}}

for(j = top; j >= 1; j--)

printf("\n");

return 0;

}

算術表示式的轉換

小明在學習了資料結構之後,突然想起了以前沒有解決的算術表示式轉化成字尾式的問題,今天他想解決一下。因為有了資料結構的基礎小明很快就解出了這個問題,但是他突然想到怎麼求出算術表示式的字首式和中綴式呢?小明很困惑。聰明的你幫他解決吧。輸入 輸入一算術表示式,以 字元作為結束標誌。資料保證無空格,只有一組...

算術表示式的轉換

time limit 1000ms memory limit 65536k 小明在學習了資料結構之後,突然想起了以前沒有解決的算術表示式轉化成字尾式的問題,今天他想解決一下。因為有了資料結構的基礎小明很快就解出了這個問題,但是他突然想到怎麼求出算術表示式的字首式和中綴式呢?小明很困惑。聰明的你幫他解...

算術表示式的轉換

time limit 1000ms memory limit 65536k 小明在學習了資料結構之後,突然想起了以前沒有解決的算術表示式轉化成字尾式的問題,今天他想解決一下。因為有了資料結構的基礎小明很快就解出了這個問題,但是他突然想到怎麼求出算術表示式的字首式和中綴式呢?小明很困惑。聰明的你幫他解...