/*乙個表示式 e 的字尾形式可以如下定義:
(1)如果 e 是乙個變數或常量,則 e 的字尾式是 e 本身。
(2)如果 e 是 e1 op e2 形式的表示式,這裡 op 是如何二元操作符,則 e 的字尾式為 e1'e2'
op,這裡 e1'和 e2'分別為 e1 和 e2 的字尾式。
(3)如果 e 是(e1)形式的表示式,則 e1 的字尾式就是 e 的字尾式。 如:我們平時寫 a+b,這是中綴表示式,寫成字尾表示式就是:ab+ (a+b)*c-(a+b)/e 的字尾表示式為: (a+b)*c-(a+b)/e →((a+b)*c)((a+b)/e)- →((a+b)c*)((a+b)e/)- →(ab+c*)(ab+e/)-
→ab+c*ab+e/-*/
/*演算法:
首先需要分配 2個棧,乙個作為臨時儲存運算子的棧 s1(含乙個結束符號),乙個作為輸入逆波蘭式的棧 s2
(空棧),s1 棧可先放入優先順序最低的運算子#,注意,中綴式應以此最低優先順序的運算子結束。可指定其他字元,不一定非#不可。從中綴式的左端開始取字元,逐序進行如下步驟:
(1)若取出的字元是運算元,則分析出完整的運算數,該運算元直接送入 s2 棧;若取出的是運算子,並且當前 s1 棧頂為(,則當前運算子直接入 s1 棧。
(2)若取出的字元是運算子,則將該運算子與 s1 棧棧頂元素比較,如果該運算子優先順序大於 s1 棧棧頂運算子優先順序,則將該運算子進 s1 棧,否者,將 s1 棧的棧頂運算子彈出, 送入 s2 棧中,直至 s1 棧棧頂運算子低於(不包括等於)該運算子優先順序,則將該運算子送入 s1 棧。
(3)若取出的字元是「(」,則直接送入 s1 棧棧頂。
(4)若取出的字元是「)」,則將距離 s1 棧棧頂最近的「(」之間的運算子,逐個出棧,依次送入 s2 棧,此時拋棄「(」。
(5)重複上面的 1~4 步,直至處理完所有的輸入字元
(6)若取出的字元是「#」,則將 s1 棧內所有運算子(不包括「#」),逐個出棧,依次送入 s2
棧。完成以上步驟,s2 棧便為逆波蘭式輸出結果。不過 s2 應做一下逆序處理。便可以按照逆波蘭式的計算方法計算了!*/
#include#include#include#includevoid shift( char notation); //中綴表示式轉換為字尾表示式的轉換函式
float calculate(float a[2],int k); //計算字尾表示式
int judge(char notation); //判斷輸入的中綴表示式是否符合要求
int grade(char a); //返回運算子的等級
void display(float a[2],int k); //在螢幕上顯示字尾表示式
//主函式
void main()
else
printf("你的表示式有錯誤,請仔細檢查!\n");
fflush(stdin);
printf("\n 你是否需要繼續計算(是輸入 y/y,否輸入其他任意鍵)\n");
scanf("%c",&choice);
getchar(); system("cls");
}while(choice=='y'||choice=='y');
printf("\n 程式結束,謝謝使用!\n");
}//判定函式
int judge(char notation)
} if(notation[0]=='*'||notation[0]=='/'||notation[0]==')'||notation[0]=='.') // 排除第乙個字元為*,/,),.
for(i=0;notation[i]!='\0';i++) //排除'+','-','*','/','.'之間的連續出現以及'+','-','*','/','.'
//後面直接加')'
}if(notation[i]=='('&&(notation[i+1]==')'||notation[i+1]=='.'||notation[i+1]=='*'||notation[i+ 1]=='/'))
if(notation[i]==')'&&(notation[i+1]=='('||notation[i+1]=='.'))//排除')'和'(','.'一起連用
}for(i=0;notation[i]!='\0';i++) //小數字不得超過 4 位
}} for(i=0;notation[i]!='\0';i++) //排除乙個小數中有兩個小數點的情況
if(notation[i]=='.')
}} for(i=0;notation[i]!='\0';i++) //排除')'後面不可以直接跟數字以及'('前面不可以加數字
if(isdigit(notation[i])&¬ation[i+1]=='(' )
}for(i=0;notation[i]!='\0';i++) //約束數字的位數一共最多為七位
}if(m>7)
}} for(i=0;notation[i]!='\0';i++) //'('與')'需要配對存在 }
return num; }
//轉換函式
void shift( char notation)
num2=0; //小數部分
t=0;
if(notation[i]=='.')
}s2[k++][0]=float(num1+num2); s2[k-1][1]=float(t);
}} if(i==0&¬ation[i]=='-') //第一位為負號的情況,**與正號類似
num2=0; t=0;
if(notation[i]=='.')
}s2[k++][0]=float(num1+num2); s2[k-1][1]=float(t);
}} if(isdigit(notation[i])) //當前字元為數字的情況與為正號的情況一樣
num2=0; t=0;
if(notation[i]=='.')
}s2[k++][0]=float(num1+num2); s2[k-1][1]=float(t);
} if(notation[i]=='+'||notation[i]=='-'||notation[i]=='*'||notation[i]=='/')
}if(notation[i]=='+'||notation[i]=='-'||notation[i]=='*'||notation[i]=='/')
else
}if(notation[i]=='(') //當前字元為'('的情況
num2=0; t=0;
if(notation[i]=='.')
}s2[k++][0]=float(num1+num2); s2[k-1][1]=float(t);}}
if(notation[i]=='-') //'('後跟負號的情況
num2=0; t=0;
if(notation[i]=='.')
}s2[k++][0]=float(num1+num2); s2[k-1][1]=float(t);}}
} if(notation[i]==')') //當前字元為')'的情況
i++;
}}while(j>0&&s1[--j]!='#') //依次將 s1 中的除了'#'外的所有操作符出棧,相當於最後的掃尾工作
printf("\n 字尾表示式(逆波蘭表示式):\n");
display(s2,k-1);
printf("\n 表示式的值為:\n");
sum=calculate(s2,k-1);
printf("%7.4f",sum);
}//計算函式
float calculate(float a[2],int k)
i=k;
while(j>=0)
if(b[i][1]==-1) //每當遇到乙個運算子則將棧最上面的兩個數出棧進行運算,然後再
//入棧
if(int(b[i][0])=='-')
if(int(b[i][0])=='*')
if(int(b[i][0])=='/')
j--;
i--;
t--;
} }return c[0]; //運算到最後,棧中的元素即為結果
}//等級函式
int grade(char a) //按照運算子的優先順序
//顯示函式
void display(float a[2],int k)
}
累並快樂著
年後到了新公司,開始組建新團隊,又趕上新專案要馬上上線,真是倍感壓力,剛開始人員一直沒有到位,我也只有一人挑起所有擔子,從需求分析,到系統方案設計,架構設計,模組開發,全面出擊,並且每天還要花大量的時間進行面試和處理部門的一些日常事務。確實有些緊張,每天都要忙到很晚,我已經有很長時間沒有這麼忙過了。...
累並快樂著
到本集團的天外綠包來協助實施計件方案已經有十天了。對方案的分析,流程的梳理已經完成了。軟體設計的方案也和天外綠包的小楊基本共同確立了。小楊水平不錯,人品也不錯。他之前在金蝶幹了十年,以二次開發為主,我倆很能聊得來!人力資源部由於浙江天外股份和天外綠包原來的兩個單位合併,新老交匯,還處在初步階段,不過...
累並快樂著3 成就是靠團隊打造的
當然,也不會完全放棄 因為我覺得在中國這樣的乙個環境,這是團隊溝通的基礎 以後工作的乙個重點,那就是所有企業和事業的根本 人!首先就是選人,作為乙個團隊甚至乙個企業,選擇優秀 合適的人確實是很重要的,作為選人,每個企業或每個人都有自己的標準,選對了人會事半功倍,選錯了人就會事倍功半,這是所有工作的根...