本文章的解決方法參考了《大話資料結構》中關於棧的應用介紹
值得注意的是,書中關於中綴表示式轉字尾的講解中不盡清楚。本人也在這裡花了點時間進行推敲錯誤的原因,也在網上搜到了這篇文章,比較好地介紹了中綴轉字尾的的規則
原理:
用計算機求解四則運算,可以使用棧。因為棧的「先進後出」的特性正好滿足了能通過字尾表示式去計算出四則表示式子的結果。而字尾表示式的轉化也能使用棧對中綴表示式進行操作從而轉化。明顯地,由中綴表示式-》字尾表示式, 字尾表示式-》式子結果。 都需要使用到棧。所以編碼實現中,我們著重的是實現這兩個過程的函式(infix_to_suffix()、suffix_to_result())
注意:
測試資料
實現
#include
#include
#include
const
int maxsize = 100;//棧的資料結構
typedef
struct stack;int table = ;//查詢運算子優先順序表
//函式說明:將中綴表示式轉換為字尾表示式
//引數說明:
//sta: 轉換過程需使用的棧空間
//infix: 待轉換的中綴表示式
//suffix: 儲存轉換後的字尾表示式
//length: 記錄字尾表示式的長度
void
infix_to_suffix
(stack *sta, char *infix, int *suffix, int *length)
;//函式說明:將字尾表示式轉換為結果直接返回
//引數說明:
//sta: 轉換過程需使用的棧空間
//suffix: 儲存轉換後的字尾表示式
//length: 記錄字尾表示式的長度
intsuffix_to_result
(stack *sta, int *suffix, int length)
;void
init
(stack *sta)
;//棧空間初始化
intmain
()void
infix_to_suffix
(stack *sta, char *infix, int *suffix, int *length)
suffix[j] = b; j++; continue; } //如果是右括號的話,將棧中在左括號以上的所有運算子彈出,然後continue
if (infix[i] == 41) sta->data[sta->top] = 0; sta->top--; //注意出棧後,須將新的棧頂元素的優先順序記錄下來 priority = table[sta->data[sta->top] % 10]; i++; continue; } //如果是左括號的話,直接壓棧
if (infix[i] == 40) //如果只是普通的運算子,則壓棧
if (infix[i] >= 42 && infix[i] <= 47) sta->top++; sta->data[sta->top] = infix[i]; //注意壓棧後,須將新的棧頂元素的優先順序記錄下來 priority = table[sta->data[sta->top] % 10]; i++; } else suffix[j] = b * -1; sta->data[sta->top] = 0; sta->top--; j++; i += 2; priority = table[sta->data[sta->top] % 10]; continue; } sta->top++; sta->data[sta->top] = infix[i]; //注意壓棧後,須將新的棧頂元素的優先順序記錄下來 priority = table[sta->data[sta->top] % 10]; i++; } } } //把棧中還存在的元素進行彈出
while (sta->top != -1) *length = j;}int
suffix_to_result
(stack *sta, int *suffix, int length)
} return result;}//初始化棧空間
void
init
(stack *sta)
sta->top = -1;}
本文章的解決方法參考了《大話資料結構》中關於棧的應用介紹
值得注意的是,書中關於中綴表示式轉字尾的講解中不盡清楚。本人也在這裡花了點時間進行推敲錯誤的原因,也在網上搜到了這篇文章,比較好地介紹了中綴轉字尾的的規則
原理:
用計算機求解四則運算,可以使用棧。因為棧的「先進後出」的特性正好滿足了能通過字尾表示式去計算出四則表示式子的結果。而字尾表示式的轉化也能使用棧對中綴表示式進行操作從而轉化。明顯地,由中綴表示式-》字尾表示式, 字尾表示式-》式子結果。 都需要使用到棧。所以編碼實現中,我們著重的是實現這兩個過程的函式(infix_to_suffix()、suffix_to_result())
注意:
測試資料
實現
#include
#include
#include
const
int maxsize = 100;//棧的資料結構
typedef
struct stack;int table = ;//查詢運算子優先順序表
//函式說明:將中綴表示式轉換為字尾表示式
//引數說明:
//sta: 轉換過程需使用的棧空間
//infix: 待轉換的中綴表示式
//suffix: 儲存轉換後的字尾表示式
//length: 記錄字尾表示式的長度
void
infix_to_suffix
(stack *sta, char *infix, int *suffix, int *length)
;//函式說明:將字尾表示式轉換為結果直接返回
//引數說明:
//sta: 轉換過程需使用的棧空間
//suffix: 儲存轉換後的字尾表示式
//length: 記錄字尾表示式的長度
intsuffix_to_result
(stack *sta, int *suffix, int length)
;void
init
(stack *sta)
;//棧空間初始化
intmain
()void
infix_to_suffix
(stack *sta, char *infix, int *suffix, int *length)
suffix[j] = b; j++; continue; } //如果是右括號的話,將棧中在左括號以上的所有運算子彈出,然後continue
if (infix[i] == 41) sta->data[sta->top] = 0; sta->top--; //注意出棧後,須將新的棧頂元素的優先順序記錄下來 priority = table[sta->data[sta->top] % 10]; i++; continue; } //如果是左括號的話,直接壓棧
if (infix[i] == 40) //如果只是普通的運算子,則壓棧
if (infix[i] >= 42 && infix[i] <= 47) sta->top++; sta->data[sta->top] = infix[i]; //注意壓棧後,須將新的棧頂元素的優先順序記錄下來 priority = table[sta->data[sta->top] % 10]; i++; } else suffix[j] = b * -1; sta->data[sta->top] = 0; sta->top--; j++; i += 2; priority = table[sta->data[sta->top] % 10]; continue; } sta->top++; sta->data[sta->top] = infix[i]; //注意壓棧後,須將新的棧頂元素的優先順序記錄下來 priority = table[sta->data[sta->top] % 10]; i++; } } } //把棧中還存在的元素進行彈出
while (sta->top != -1) *length = j;}int
suffix_to_result
(stack *sta, int *suffix, int length)
} return result;}//初始化棧空間
void
init
(stack *sta)
sta->top = -1;}
用棧實現四則運算
課本53頁,用棧來實現的簡單的四則運算表示式.是表示式結束符,注意在表示式輸入完畢後需再輸入乙個 表示結束.eg 4 2 3 10 5 include include include include include using namespace std stack opnd 運算元棧 stack ...
棧問題2(四則運算)
利用棧實現形如 a b c d e f g 的運算 先從中綴式轉為字尾式 然後再計算 可輸入空格 include include include using namespace std a b c d e f g 1 1 1 2 1 1 2 8 3 5 1 2 0 1 1 9 20 3 6 1 1 ...
Python 棧 四則運算
首先了解一下棧 棧是限定僅在表尾進行插入和刪除操作的線性表。允許插入與刪除的一段叫做棧頂,另一端 叫做棧底,不含任何資料元素的棧稱為空棧。棧又稱為後進先出 last in first out 的線性 表,簡稱lifo結構。在python中,可以用列表來實現棧 lt 3 相當於壓棧 print lt ...