用棧解決四則運算問題

2021-09-19 13:30:25 字數 4811 閱讀 7848

本文章的解決方法參考了《大話資料結構》中關於棧的應用介紹

值得注意的是,書中關於中綴表示式轉字尾的講解中不盡清楚。本人也在這裡花了點時間進行推敲錯誤的原因,也在網上搜到了這篇文章,比較好地介紹了中綴轉字尾的的規則

原理:

用計算機求解四則運算,可以使用。因為「先進後出」的特性正好滿足了能通過字尾表示式去計算出四則表示式子的結果。而字尾表示式的轉化也能使用對中綴表示式進行操作從而轉化。明顯地,由中綴表示式-》字尾表示式, 字尾表示式-》式子結果。 都需要使用到。所以編碼實現中,我們著重的是實現這兩個過程的函式(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 ...