優先順序:*,\ > +, -
如果輸入運算子的優先順序低於或等於棧頂的操作符優先順序,則棧內元素進入輸入佇列,輸入運算子入棧。
乙個簡單的例子
演算法示意圖,使用了3個空間。輸入用符號代替,如果輸入是乙個數字則直接進輸出佇列,即圖中 b),d),f),h)。如果輸入是運算子,則壓入操作符堆疊,即圖中 c),e),但是,如果輸入運算子的優先順序低於或等於運算子棧頂的操作符優先順序,則棧內元素進入輸出佇列,輸入操作符壓入運算子堆疊,即圖中 g)。 最後,運算子堆疊內元素入輸出佇列,演算法結束.
輸入:3+4
將3入輸出佇列(每當輸入乙個數字時,直接進入輸出佇列)
將+號壓入運算堆疊
將4入輸出佇列
輸入結束,將操作符堆疊中剩餘操作符入輸出佇列
在本情況下只有+號
輸出 3 4 +
通過這個例子可以看出兩條規則:
輸入: 3 + 4 * 2 / ( 1 − 5 ) ^ 2 ^ 3
輸入動作
輸出 (逆波蘭表示法)
運算子棧提示3
將符號加入輸出佇列3+
將符號壓入操作符堆疊3+
4將符號加入輸出佇列
3 4+
*將符號壓入操作符堆疊
3 4* +
*號的優先順序高於+號
2將符號加入輸出佇列
3 4 2
* +/
將堆疊中元素彈出,加入輸出佇列
3 4 2 *
+/號和*號優先順序相同
將符號壓入操作符堆疊
3 4 2 *
/ +/號的優先順序高於+號
(將符號壓入操作符堆疊
3 4 2 *
( / +
1將符號加入輸出佇列
3 4 2 * 1
( / +
−將符號壓入操作符堆疊
3 4 2 * 1
− ( / +
5將符號加入輸出佇列
3 4 2 * 1 5
− ( / +
)將堆疊中元素彈出,加入輸出佇列
3 4 2 * 1 5 −
( / +
迴圈直到找到(號
將堆疊元素彈出
3 4 2 * 1 5 −
/ +括號匹配結束
^將符號壓入操作符堆疊
3 4 2 * 1 5 −
^ / +
^號的優先順序高於/號
2將符號加入輸出佇列
3 4 2 * 1 5 − 2
^ / +
^將符號壓入操作符堆疊
3 4 2 * 1 5 − 2
^ ^ / +
^號為從右至左求值
3將符號加入輸出佇列
3 4 2 * 1 5 − 2 3
^ ^ / +
end將棧中所有資料加入輸出佇列
3 4 2 * 1 5 − 2 3 ^ ^ / +
//main.c
#include
#include
#include
#include "
stack.h
"int getpriority(char ch)
}int isnumber(char ch)
int main()
else
else
if(expression[n] == ')')
pop(stack);
}else
else
push(stack, expression[n]);}}
}}while(!isempty(stack))
printf("
\n");
return
0;}
//stack.h
#ifndef _operator_stack_h_
#define _operator_stack_h_
#define stack_length 100
typedef struct operatorstack
operatorstack;
int push(operatorstack *stack, char ch);
char pop(operatorstack *stack);
int isempty(operatorstack *stack);
char gettop(operatorstack *stack);
#endif
//stack.c
#include "
stack.h
"int push(operatorstack *stack, char ch)
stack->operator_stack[stack->size] = ch;
stack->size++;
return1;}
char pop(operatorstack *stack)
stack->size--;
return stack->operator_stack[stack->size];
}char gettop(operatorstack *stack)
return stack->operator_stack[stack->size - 1];
}int isempty(operatorstack *stack)
中綴表示式轉換成字尾表示式
一 基礎知識 中綴表示式 人們常用的表示式就叫做中綴表示式,如a b c d 字尾表示式 又叫做逆波蘭表示式,由一名波蘭數學家提出,方便進棧操作 字尾表示式也叫逆波蘭表示式,其求值過程可以用到棧來輔助儲存。假定待求值的字尾表示式為 6 5 2 3 8 3 則其求值過程如下 1 遍歷表示式,遇到的數字...
中綴表示式轉換成字尾表示式
中綴表示式轉字尾表示式 思路 三個方法 將中綴表示式轉換成 中綴表示式對應的 list 自定義運算子優先順序 將中綴表示式對應的 list 轉換成 字尾表示式.1.1 使用 list 更好的和 stack 配合,list 比 字串的遍歷更加靈活.將中綴表示式對應的 list 轉換成 字尾表示式 2....
中綴表示式轉換成字尾表示式 棧
字尾表示式嚴格按照從左到右進行計算的模式,符合計算機執行方式,而中綴表示式需要計算機遇到符號後向後掃瞄一位,若為括號或優先順序更高的操作符還需要向後繼續掃瞄。設我們欲將中綴表示式 a b c d e f g轉換成字尾表示式,正確的答案為 abc de f g 當我們讀入運算元的時候,立即將其放入到輸...