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/defhinta*b+c-d/e*f
ab*cde/-f*+
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 小明在學習了資料結構之後,突然想起了以前沒有解決的算術表示式轉化成字尾式的問題,今天他想解決一下。因為有了資料結構的基礎小明很快就解出了這個問題,但是他突然想到怎麼求出算術表示式的字首式和中綴式呢?小明很困惑。聰明的你幫他解...