搗騰了一天,總算有個雛形了,先發上來吧,已知的bug:1.直接輸入回車會溢位,2.表示式不完整會溢位,3.多餘的)會造成未知的結果,但是如果是在式子的最後是沒有問題的,4.中文的字元會報錯。
目前已知的就這麼多了吧
下面上**:
#include #include #include struct __stack
;typedef struct __stack* p_list;
// cdecl.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
bool priority(const char a, const char b)
void beempty(p_list head) //釋放空間,不需要人為呼叫
}
void frist_time(p_list &head) //首次建立頭節點時使用
void creat_list(p_list &node) //建立其餘節點時使用
double calc(p_list head) //用於計算最後的結果,其中判斷運算模式可以自行按照需要修改
else
creat_list(temp);
temp->number = h_temp->number;
} else
else if (h_temp->symbol == '-')
else if (h_temp->symbol == '*')
else if (h_temp->symbol == '/')
else
}} sum = stuck->number;
stuck->next = null;
beempty(stuck);
beempty(head);
return sum;
}p_list scan_list() //輸入中綴表示式
else
creat_list(pl_temp);
pl_temp->symbol = c_temp;
pl_temp->number = (double)0xcccccccccccccccc;
}} else
else
creat_list(pl_temp);
pl_temp->number = atoi(str_temp);
pl_temp->symbol = 0;
} }return t_head;
}void print_list(const p_list head) //列印鍊錶
}p_list m_bracket(p_list p_temp,p_list &temp, char *stuck_symbol, int i, bool(*p_function)(const char a, const char b))
//遇到括號時呼叫的函式
if (p_temp->symbol == 0)
if (t_i == 0 || p_function(stuck_symbol[t_i - 1], p_temp->symbol))
else
++t_i;
temp_stuck_symbol[t_i] = p_temp->symbol;
++t_i;
} }for (--t_i; t_i >= 0; --t_i)
p_temp = p_temp->next;
return p_temp;
}p_list excange(p_list head,bool (*p_function)(const char a, const char b)) //中綴轉換字尾主函式,函式指標為優先順序判斷函式,此函式需要使用者按照需求自定義
else
if (p_temp->symbol == 0)
else
creat_list(temp);
temp->number = p_temp->number;
temp->symbol = 0;
continue;
} if (i == 0 || p_function(stuck_symbol[i-1], p_temp->symbol))
else
++i;
stuck_symbol[i] = p_temp->symbol;
++i;
} }for (--i; i >= 0; --i) //清空符號棧
beempty(head);
return t_head;
}int main(void)
大概的思路如圖:
(資料出處:排程場演算法)
遇到括號時,當作輸入了乙個新的中綴表示式處理即可,此時符號棧偏移到之前原本佔未使用的部分,並且重新定義指標,讓括號處理函式誤認為這個是乙個新的符號棧
這樣最後總轉換函式出棧是沒有問題的
以上提到的bug會盡快修復更新,謝謝!
字首 波蘭式 中綴 字尾表示式 逆波蘭式
中綴表示式 中綴表示式就是常見的運算表示式,如 3 4 5 6 字尾表示式 字尾表示式又稱逆波蘭表示式,與字首表示式相似,只是運算子位於運算元之後 比如 3 4 5 6 與字首表示式類似,只是順序是從左至右 從左至右掃瞄表示式,遇到數字時,將數字壓入堆疊,遇到運算子時,彈出棧頂的兩個數,用運算子對它...
將表示式轉換為逆波蘭表示式
給定乙個表示式字串陣列,返回該表示式的逆波蘭表示式 即去掉括號 樣例對於 3 4 5 的表示式 該表示式可表示為 3 4 5 返回 3 4 5 該表示式可表示為 3 4 5 class solution else if expression i else if expression i operat...
中綴表示式轉逆波蘭表示式
op icp064 21isp015 36思路假設表示式為string ex a b c d 將表示式處理為 a b c d 以 做末尾標識,初始時 棧s 中放入乙個 int i 0 icp表示表示式當前掃瞄項的字元的優先順序,isp表示棧頂操作符的優先順序 優先順序表如上 當 棧非空 或 當前掃瞄...