逆波蘭式生成程式(累並快樂著)

2021-08-30 02:22:23 字數 4195 閱讀 3664

/*乙個表示式 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 成就是靠團隊打造的

當然,也不會完全放棄 因為我覺得在中國這樣的乙個環境,這是團隊溝通的基礎 以後工作的乙個重點,那就是所有企業和事業的根本 人!首先就是選人,作為乙個團隊甚至乙個企業,選擇優秀 合適的人確實是很重要的,作為選人,每個企業或每個人都有自己的標準,選對了人會事半功倍,選錯了人就會事倍功半,這是所有工作的根...