棧在表示式計算過程中的應用:建立運算元棧和運算子棧。運算子有優先順序。
規則:
自左至右掃瞄表示式,凡是遇到運算元一律進運算元棧。
當遇到運算子時,如果它的優先順序比運算子棧棧頂元素的優先順序高就進棧。反之,取出棧頂運算子和運算元棧棧頂的連續兩個運算元進行運算,並將結果存入運算元棧,然後繼續比較該運算子與棧頂運算子的優先順序。
左括號一律進運算子棧,右括號一律不進運算子棧,取出運算子棧頂運算子和運算元棧頂的兩個運算元進行運算,並將結果壓入運算元棧,直到取出左括號為止。
#include #include #include #define max 100
enum link;
typedef struct // 運算數
op_num;
typedef struct // 運算子
op_ch;
// 運算數置空棧
void setnull_num (op_num* s)
// 運算子置空棧
void setnull_ch (op_ch* s)
// 判斷是否是數字,是返回1 不是返回0
int is_num (char ch)
else
}
// 數字入棧
int push_num (op_num *s, int data)
else
}// 運算子入棧
int push_ch (op_ch* s, char ch)
else
}// 判斷是否將運算子入棧
int jud (op_ch* s, char ch)
else
else
break;
}case '*':
case '/':
else
break;
}case '(':}}
}// 數字出棧
int pop_num (op_num* s)
// 運算子出棧
void pop_ch (op_ch* s)
// 進行運算
void operate (op_ch* s_ch, op_num* s_sum)
push_num (s_sum, result); // 將運算結果入棧
}int main()
str_num[t] = '\0';
push_num (&sdata, atoi(str_num));
// 遇到算數符號的時候讓符號前面的數進棧
}else
else
else // 遇到')'
// 不斷取字元運算 知道遇到 ')'
while (soper.str[soper.top] != '(');
pop_ch (&soper);
// 將『(』彈出棧空間}}
i++;}}
while (soper.top != -1)
printf ("%d\n", sdata.num[sdata.top]);
return 0;
}
棧在表示式計算中的應用
逆波蘭式 reverse polish notation,rpn,或逆波蘭記法 也叫字尾表示式 將運算子寫在運算元之後 將乙個普通的中序表示式轉換為逆波蘭表示式的一般演算法是 首先需要分配2個棧,乙個作為臨時儲存運算子的棧s1 含乙個結束符號 乙個作為輸入逆波蘭式的棧s2 空棧 s1棧可先放入優先順...
棧在表示式求值中的應用
中綴表示式轉字尾表示式 初始化乙個棧,用來儲存暫還不能確定運算順序的運算子 從左到右處理各個元素,直到末尾。可能遇到三種情況 遇到運算子 依次彈出棧中優先順序高於或等於當前運算子的所有運算子,並加入字尾表示式,若碰到 或棧空則停止。之後再把當前運算子入棧 按上述方法處理完所有字元後,將棧中剩餘運算子...
棧在表示式求值中的應用
一 中綴表示式轉字尾表示式 從左到右處理各個元素 1.遇到運算元。直接加入字尾表示式 2.遇到界限符。遇到 直接入棧,遇到 則依次彈出棧內運算子並加入字尾表示式,直到彈出 為止。注意 不加入字尾表示式。3.遇到運算子。依次彈出棧中優先順序高於或等於當前運算子的所有運算子,並加入字尾表示式,若碰到 或...