1. 程式人生 > 其它 >表示式轉換——中綴表示式轉換為字尾表示式

表示式轉換——中綴表示式轉換為字尾表示式

技術標籤:c++資料結構

表示式轉換

算術表示式有字首表示法、中綴表示法和字尾表示法等形式。日常使用的算術表示式是採用中綴表示法,即二元運算子位於兩個運算數中間。請設計程式將中綴表示式轉換為字尾表示式。

輸入格式:
輸入在一行中給出不含空格的中綴表示式,可包含+、-、*、\以及左右括號(),表示式不超過20個字元。

輸出格式:
在一行中輸出轉換後的字尾表示式,要求不同物件(運算數、運算子號)之間以空格分隔,但結尾不得有多餘空格。

輸入樣例:

2+3*(7-4)+8/4

輸出樣例:

2 3 7 4 - * + 8 4 / +

知識點:將中綴表示式轉化為字尾表示式:
兩種情況:
(1)沒有括號的中綴表示式轉化為字尾表示式:

沒有括號的中綴表示式轉化為字尾表示式
(2)帶有括號的中綴表示式轉化為字尾表示式:

帶有括號的中綴表示式轉化為字尾表示式
分析:本題是帶有括號的中綴表示式,需要利用第二種方式實現,模擬過程我會在程式碼上詳解
這裡說一下這道題的細節問題:
中綴表示式轉換為字尾表示式:對於本題而言,細節過多,在完成表示式轉換的基礎上
1.需要控制空格,首尾不能出現空格
2.需要判斷一位以上的數字之間不能有空格
3.需要判斷小數的情況,注意之間不能有空格
4.需要判斷鑲嵌括號的情況,容易出現格式錯誤
例如:當一開始就輸入多個空格會使首位出現空格
5.需要判斷正負號
(1)對於正號,當出現在第一位時需直接特判(在第一位無需加括號)
未在第一位出現正號一定會在括號內,而且輸出時正號要省略

(2)對於負號,當出現在第一位時需要直接特判(在第一位出現無需加括號)
未在第一位出現負號一定會在括號內,需要輸出負號
(3)注意控制好空格,防止格式錯誤

下面是程式碼:


#include<cstdio>
#include<cstring>
#include<iostream>
#include<stack>
#include<algorithm>
using namespace std;
const int M=1010;
char str[M],st[M],c;
stack<char> q;
int main()
{
    int
i,j,k=0,l,m,n,f=0,t=0,ff=0; cin.getline(str,110); l=strlen(str); for(i=0; i<l; i++) { if(str[i]>='0'&&str[i]<='9')///為數字時輸出 { t=1;///標記已經出現過數字 ///解決當有鑲嵌括號時的格式問題 if(ff==0)///特判當剛開始有鑲嵌括號時防止f=1對格式的影響 { printf("%c",str[i]); ff=1; f=0; continue; } ///解決超過一位數的問題 if(f==0)///遇到數字並且前一個也是數字或'.'輸出 printf("%c",str[i]); else ///f=1時遇到數字加空格輸出,並使f=0 { printf(" %c",str[i]); f=0; } } ///解決小數問題 else if(str[i]=='.')///遇到點說明為小數直接輸出 { printf("%c",str[i]); } ///解決第一位為正數帶'+'的問題 else if(i==0&&str[i]=='+') { printf("%c",str[i]); } ///解決第一位為正數帶'-'的問題 else if(i==0&&str[i]=='-') { printf("%c",str[i]); } ///解決非第一位為正數帶'-'的問題 else if(str[i]=='('&&str[i+1]=='-') { ///輸出符號 if(t==1)///若已經出現數字,加符號時需在前面加空格 printf(" %c",str[i+1]); else printf("%c",str[i+1]); q.push(str[i]);///將括號入棧 f=0;///輸出數字無需加空格 i++;///跳過這個'-' } ///解決非第一位為正數帶'+'的問題 else if(str[i]=='('&&str[i+1]=='+') { ///帶正號的數字的正號可以約去 q.push(str[i]);///將括號入棧 f=1;///輸入數字時需要加空格 i++;///跳過'+' } ///當遇見左括號 else if(str[i]=='(') { q.push(str[i]);///放入棧中 f=1; } ///遇見右括號 else if(str[i]==')') { ///輸出左括號到右括號之間的符號 while(q.top()!='(') { printf(" %c",q.top()); f=1;///當輸入數字時需加空格 q.pop();///將輸出的字元出棧 } //printf("%c\n",q.top()); q.pop();///將左括號出棧 } else { ///當棧為空或者棧頂元素為左括號 if(q.size()==0||q.top()=='(') { f=1;///輸入數字時需要加空格 q.push(str[i]);///將符號放入棧中 } ///當需要入棧的符號優先順序大於棧頂符號優先順序 else if((str[i]=='*'||str[i]=='/')&&(q.top()=='+'||q.top()=='-')) { f=1;///輸入數字時需加括號 q.push(str[i]);///將符號入棧 } ///入棧的符號優先順序小於或等於棧頂符號優先順序 ///棧中元素不為空且棧頂元素不是左括號 else { ///當棧頂元素為'*'或'/' if(q.top()=='*'||q.top()=='/') { f=1;///輸入數字需加空格 printf(" %c",q.top());///加空格輸出棧頂元素 q.pop();///將棧頂元素出棧 ///出棧完看棧中元素是否為空 ///此時四種情況 ///(1)棧中元素為0 ///(2)棧頂元素為'(' ///(3)棧底元素為'+'或'-',輸入符號為'*'或'/' ///(4)棧底元素為'+'或'-',輸入符號為'+'或'-' ///情況一和情況二 if(q.size()==0||q.top()=='(') { f=1;///輸出數字時需加空格 q.push(str[i]);///將符號放入棧中 } ///情況三 else if(str[i]=='*'||str[i]=='/') { f=1;///輸出數字時需加空格 q.push(str[i]);///直接將符號入棧 } ///情況四 else if(str[i]=='+'||str[i]=='-') { f=1;///輸出數字時需加空格 printf(" %c",q.top());///將棧頂元素加空格輸出 q.pop();///棧頂元素出棧 q.push(str[i]);///將符號放入棧中 } } ///當棧頂元素為'+'或'-' else if(q.top()=='+'||q.top()=='-') { ///兩種情況 ///(1)入棧符號為'*'或'/' ///(2)入棧符號為'+'或'-' ///情況一 if(str[i]=='*'||str[i]=='/') { f=1;///輸出數字時需加空格 q.push(str[i]);///將符號放入棧中 } else if(str[i]=='+'||str[i]=='-') { f=1;///輸出數字時需加空格 printf(" %c",q.top());///輸出棧頂元素 q.pop();///棧頂元素出棧 q.push(str[i]);///將符號放入棧中 } } } } } ///當棧中符號未完全出棧 while(q.size()!=0) { printf(" %c",q.top());///將棧中符號依次輸出 q.pop();///依次出棧 } printf("\n"); return 0; }