思想:我們平時輸入的四則運算表示式,例如:9*(3-1)+2,屬於中綴表示式。我們需要將它轉換成字尾表示式:
9 3 1 - * 2 +的形式求值。其中需要兩個棧:數字棧和運算子棧。
過程:
逐個讀取中綴表示式(char型):9*(3-1)+2
1.如果是數字則壓入數字棧(如果是大於一位的數字則需要寫個函式轉換成int型)
2.如果是'('則壓入運算子棧中
3.如果是'+'或者'-',判斷一下運算子的棧頂元素,如果是'*','/','+','-'則出棧,呼叫出棧函式(利用數字棧和運算子棧算出中間結果),然後將該運算子壓入運算子棧中
4.如果是'*'或者'/',判斷一下運算子的棧頂元素,如果是'*'或者'/',則出棧,呼叫出棧函式,然後將該運算子壓入運算子棧中
5.如果是'(',則直接呼叫出棧函式,直到將'('出棧為止
6.遍歷完中綴表示式後,如果此時運算子棧不為空,則呼叫出棧函式逐個出棧
7.最後的結果是數字棧的棧頂元素
**:
/*--------------------------------------------
--利用棧進行四則運算,將中綴表示式轉換成字尾表示式求值--
--------------------------------------------*/
#include
#include
#define maxsize 30
//出棧函式
void pop(int *num,char *c,int *num_p,int *str_p)
//字元陣列裡的數字轉換成int型
void change(int *num,char *all,int *all_p,int *num_p)
number1--;
int result=0;
while(all[*all_p]-'0'>=0&&all[*all_p]-'0'<=9)
(*all_p)--;
//printf("=%d,",*all_p);
num[++(*num_p)]=result;
}
int main(void)
else
str[++str_top]=c;
}
//該字元是'*'或者'/'
else if(c=='*'||c=='/')
else
str[++str_top]=c;
}
//該字元是')'
else if(c==')')
//printf("字元:%c\n",str[str_top]);
}
while(str_top>0)
pop(number,str,&num_top,&str_top);
printf("運算結果為:%d\n",number[num_top]);
return 0;
}
棧應用 四則運算
輸入字串格式的算術表示式,如 3 2 輸出去結果。棧的應用 四則運算分為下列四個過程 讀取字串 並不是簡單地讀入,比如 當字串中有兩位數,例如12時,我們應該讀成 12 而不是 1 2 不然運算會出現錯誤 處理字串,給字串加0 為了保證字尾運算的正常執行,需要對出現的負數進行考慮。例如 4 3 為了...
棧的應用 四則運算 c
四則運算主要分為兩個部分 中綴轉字尾 規則為 先遍歷中綴表示式的每乙個字元,如果是數字直接輸出到字尾表示式,如果是符號,需要判斷與棧頂符號的優先順序,是右括號或者優先順序高於棧頂符號 乘除優先於加減 則依次輸出出棧並輸出,然後將當前符號壓入棧。這裡把符號分為幾類 入棧 棧頂符號依次出棧並輸出直到棧頂...
棧的實際應用 四則運算
四則運算 計算機在進行運算過程會先將中綴轉成字尾進行計算。中綴表示式 9 6 3 8 4 字尾表示式 96 3 84 中綴轉字尾規則 借助輔助棧,遇到數字或字母,列印 遇到符號,將當前符號與棧頂符號進行優先順序比較。如果當前符號優先順序高,則直接入棧,如果當前符號優先順序較低,則將棧頂元素依次出棧,...