close
中置式下載(mofile)
中置式下載(1001m)
重要:我的這個程式,要輸入中置式前請先輸入「i」就只有這個英文,前後不用空白,中置式的數字與運算子中間也不需要空白。若末輸入「i」則會變成後置式。
另外,此程式主要是將輸入的中置式傳到副程式去轉換,轉成後置式後傳回主程式做運算。
5/10更新:補上中置轉後置的條件
一、數字字串:無條件copy至輸出字串(中間要用空白隔開)
二、運算子(+-*/):
(1)當空stack或stack最上層為"("時,無條件push
(2)與stack最上層的運算子比較先後
<1>先:無條件push
<2>後:pop stack至輸出字串,重新檢視(2)直到成為先
三、左括號:無條件push"("
四、右括號:pop至左括號(左括號不輸出)
五、\0:pop至空括號為止
補充條件:因現在只用到+-*/這四個運算子,故,先=>*,/ 後=>+,-
中置與後置的不同:(以我寫的程式為準@@) 多了三隻副程式
void cpush(char x) 為把char push的程式,故取名cpush
char cpop(void) 為把char pop的程式,故取名cpop
void inx(char x[],char y[]) 將中置轉後置的程式 cpush跟cpop基本上和push跟pop是一樣的東西,只是格式不同,所以講解以inx為主
void inx(char x[],char y[]){
int i=0 , j=1,a,q;
for( q=1; j != 0 ; ){ q為啥是1開始呢,這就要看主程式了,因為我的中置式必需在輸入字串時,第一個字要輸入i才會進入中置式的副程式,故x[0]一定等於' i ',所以就不用檢視第0個位置。
switch(x[q]){ 檢視q裡面存的東西
case '+': 若是+則進入
for(a=1;a;){ 由於2-2-2的條件說,要pop之後還要重新檢視,故設一變數a做檢視工作,另,這行可刪,因後面程式變動,所以這行可有可無
if(csp==0 || steak[csp-1]== ' ( ' ){ 為2-1-1的條件
cpush(x[q++]); a=0; } else{ 判斷2-2-1or2,配合補充的條件,所以若是前面有東西,不論是+-*/的任何一個,跟現在的+相比,+永遠是後,所以便將steak裡的所有符號都pop乾淨,故for(a=1;a;)這行可刪 for(;csp>0;){
y[i++]=cpop();
y[i++]=' '; }
}
break;
case ' * ': 若是 ' * '則進入
if(steak[csp-1]!='*' && steak[csp-1]!='/'){ 判斷2-2-1or2,配合補充條件,能比*先的只有*或/,所以判斷steak最上層是否為*或/,若兩個都不是則是2-2-1,其中一個是則為2-2-2
cpush(x[q++]);
break;
}
else{
y[i++]=cpop();
y[i++]=' ';
cpush(x[q++]);
break; }
default: 呃,這東西的解釋是啥我也搞不太懂,總之我都把他當成以上皆非來用
if(x[q]==' ( '){ 若為條件3則無條件push
cpush(x[q++]);
break;
}
if(x[q]==')'){ 若為條件4,則pop至左括號
for(;steak[csp-1]!='(';){
y[i++]=cpop();
y[i++]=' ';
}
csp--; 左括號不輸出
q++;
break;
}
if(x[q]=='\0'){ 若為條件5,則pop至空stack
for(;csp>0;){
y[i++]=cpop();
y[i++]=' ';
} j=0; 結束for(q=1;j!=0;)
y[i]='\0';
break;
}
6/28更新內容:程式重新上傳,版面更改,和小bug修正。
為了表現我有多心機,所以bug修正只在網誌最後面貼出,沒看完…嘿嘿,就祈禱老師不要發現bug吧。
希望各位有看到這行字XD,那至少代表…我寫的解釋有人看…(感動)
在main裡面
gets(line);
if(line[0]=='i'){
inx(line,line1);
}
else{
for(i=0;line[i]!='\0';i++)
line1[i]=line[i];
line1[i]='\0'; 這行為需要自行新增上去的字,這裡就不多說了,想知道為什麼的再來問我吧。
}
中置式下載(1001m)
重要:我的這個程式,要輸入中置式前請先輸入「i」就只有這個英文,前後不用空白,中置式的數字與運算子中間也不需要空白。若末輸入「i」則會變成後置式。
另外,此程式主要是將輸入的中置式傳到副程式去轉換,轉成後置式後傳回主程式做運算。
5/10更新:補上中置轉後置的條件
一、數字字串:無條件copy至輸出字串(中間要用空白隔開)
二、運算子(+-*/):
(1)當空stack或stack最上層為"("時,無條件push
(2)與stack最上層的運算子比較先後
<1>先:無條件push
<2>後:pop stack至輸出字串,重新檢視(2)直到成為先
三、左括號:無條件push"("
四、右括號:pop至左括號(左括號不輸出)
五、\0:pop至空括號為止
補充條件:因現在只用到+-*/這四個運算子,故,先=>*,/ 後=>+,-
中置與後置的不同:(以我寫的程式為準@@) 多了三隻副程式
void cpush(char x) 為把char push的程式,故取名cpush
char cpop(void) 為把char pop的程式,故取名cpop
void inx(char x[],char y[]) 將中置轉後置的程式 cpush跟cpop基本上和push跟pop是一樣的東西,只是格式不同,所以講解以inx為主
void inx(char x[],char y[]){
int i=0 , j=1,a,q;
for( q=1; j != 0 ; ){ q為啥是1開始呢,這就要看主程式了,因為我的中置式必需在輸入字串時,第一個字要輸入i才會進入中置式的副程式,故x[0]一定等於' i ',所以就不用檢視第0個位置。
switch(x[q]){ 檢視q裡面存的東西
case '+': 若是+則進入
for(a=1;a;){ 由於2-2-2的條件說,要pop之後還要重新檢視,故設一變數a做檢視工作,另,這行可刪,因後面程式變動,所以這行可有可無
if(csp==0 || steak[csp-1]== ' ( ' ){ 為2-1-1的條件
cpush(x[q++]); a=0; } else{ 判斷2-2-1or2,配合補充的條件,所以若是前面有東西,不論是+-*/的任何一個,跟現在的+相比,+永遠是後,所以便將steak裡的所有符號都pop乾淨,故for(a=1;a;)這行可刪 for(;csp>0;){
y[i++]=cpop();
y[i++]=' '; }
}
break;
case ' * ': 若是 ' * '則進入
if(steak[csp-1]!='*' && steak[csp-1]!='/'){ 判斷2-2-1or2,配合補充條件,能比*先的只有*或/,所以判斷steak最上層是否為*或/,若兩個都不是則是2-2-1,其中一個是則為2-2-2
cpush(x[q++]);
break;
}
else{
y[i++]=cpop();
y[i++]=' ';
cpush(x[q++]);
break; }
default: 呃,這東西的解釋是啥我也搞不太懂,總之我都把他當成以上皆非來用
if(x[q]==' ( '){ 若為條件3則無條件push
cpush(x[q++]);
break;
}
if(x[q]==')'){ 若為條件4,則pop至左括號
for(;steak[csp-1]!='(';){
y[i++]=cpop();
y[i++]=' ';
}
csp--; 左括號不輸出
q++;
break;
}
if(x[q]=='\0'){ 若為條件5,則pop至空stack
for(;csp>0;){
y[i++]=cpop();
y[i++]=' ';
} j=0; 結束for(q=1;j!=0;)
y[i]='\0';
break;
}
6/28更新內容:程式重新上傳,版面更改,和小bug修正。
為了表現我有多心機,所以bug修正只在網誌最後面貼出,沒看完…嘿嘿,就祈禱老師不要發現bug吧。
希望各位有看到這行字XD,那至少代表…我寫的解釋有人看…(感動)
在main裡面
gets(line);
if(line[0]=='i'){
inx(line,line1);
}
else{
for(i=0;line[i]!='\0';i++)
line1[i]=line[i];
line1[i]='\0'; 這行為需要自行新增上去的字,這裡就不多說了,想知道為什麼的再來問我吧。
}
全站熱搜