表示式轉換——中綴表示式轉換為字尾表示式
阿新 • • 發佈:2020-12-30
表示式轉換
算術表示式有字首表示法、中綴表示法和字尾表示法等形式。日常使用的算術表示式是採用中綴表示法,即二元運算子位於兩個運算數中間。請設計程式將中綴表示式轉換為字尾表示式。
輸入格式:
輸入在一行中給出不含空格的中綴表示式,可包含+、-、*、\以及左右括號(),表示式不超過20個字元。
輸出格式:
在一行中輸出轉換後的字尾表示式,要求不同物件(運算數、運算子號)之間以空格分隔,但結尾不得有多餘空格。
輸入樣例:
2+3*(7-4)+8/4
輸出樣例:
2 3 7 4 - * + 8 4 / +
知識點:將中綴表示式轉化為字尾表示式:
兩種情況:
(1)沒有括號的中綴表示式轉化為字尾表示式:
(2)帶有括號的中綴表示式轉化為字尾表示式:
分析:本題是帶有括號的中綴表示式,需要利用第二種方式實現,模擬過程我會在程式碼上詳解
這裡說一下這道題的細節問題:
中綴表示式轉換為字尾表示式:對於本題而言,細節過多,在完成表示式轉換的基礎上
1.需要控制空格,首尾不能出現空格
2.需要判斷一位以上的數字之間不能有空格
3.需要判斷小數的情況,注意之間不能有空格
4.需要判斷鑲嵌括號的情況,容易出現格式錯誤
例如:當一開始就輸入多個空格會使首位出現空格
5.需要判斷正負號
(1)對於正號,當出現在第一位時需直接特判(在第一位無需加括號)
未在第一位出現正號一定會在括號內,而且輸出時正號要省略
未在第一位出現負號一定會在括號內,需要輸出負號
(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;
}