棧在表示式計算過程中的應用

2021-08-22 10:10:55 字數 1638 閱讀 5490

棧在表示式計算過程中的應用:建立運算元棧和運算子棧。運算子有優先順序。 

規則: 

自左至右掃瞄表示式,凡是遇到運算元一律進運算元棧。 

當遇到運算子時,如果它的優先順序比運算子棧棧頂元素的優先順序高就進棧。反之,取出棧頂運算子和運算元棧棧頂的連續兩個運算元進行運算,並將結果存入運算元棧,然後繼續比較該運算子與棧頂運算子的優先順序。 

左括號一律進運算子棧,右括號一律不進運算子棧,取出運算子棧頂運算子和運算元棧頂的兩個運算元進行運算,並將結果壓入運算元棧,直到取出左括號為止。

#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.遇到運算子。依次彈出棧中優先順序高於或等於當前運算子的所有運算子,並加入字尾表示式,若碰到 或...