完整的演算法需要用到乙個佇列和乙個棧
遍歷中綴表示式,如果遇到運算數,直接把運算數入佇列,如果遇到左括號,將左括號入棧,如果遇到右括號,彈出棧中所有元素加入佇列,直到遇到左括號,如果遇到加減乘除運算子,與棧頂的運算子比較優先順序(注意左括號的優先順序最低),如果棧頂優先順序低於當前的優先順序,直接入棧,若否,彈出當前運算子入佇列,直到棧頂運算子低於當前運算子
#define _crt_secure_no_warnings
#include #include #include #include "linkstack.h"
int isnumber(char c)
void numberoperator(char c)
int isleft(char c)
int isright(char c)
int isoperator(char c)
typedef struct mychar
mychar;
// 建立mychar
mychar* createmychar(char* p)
void leftoperate(linkstack* stack, char *p) // 左括號操作
int getprirority(char c)
void rightoperator(linkstack* stack)
printf("%c", *(mychar->p)); // 輸出
pop_linkstack(stack); // 彈出 }}
void operatoroperate(linkstack* stack, char* p)
// 如果棧頂優先順序低於當前字元的優先順序,直接入棧
if (getprirority(*(mychar->p)) < getprirority(*p))
else
printf("%c", *(mychar2->p)); // 輸出
pop_linkstack(stack); // 彈出
free(mychar2);
} }}int main()
if (isleft(*p))
if (isright(*p)) // 如果遇到右括號
if (isoperator(*p)) // 如果遇到運算子
// 如果遇到運算符號
p++;
} while (size_linkstack(stack) > 0)
printf("\n");
system("pause");
freespace_linkstack(stack);
}
這裡的棧程式使用了前面的企業鏈式棧
#pragma once
typedef struct linknode
linknode;
typedef struct linkstack
linkstack;
linkstack* init_linkstack(); // 初始化函式
void push_linkstack(linkstack* stack, linknode* data); // 入棧
linknode* top_linkstack(linkstack* stack); // 返回棧頂元素
void pop_linkstack(linkstack* stack); // 出棧
int size_linkstack(linkstack* stack); // 返回棧的尺寸
void clear_linkstack(linkstack* stack); // 清空棧
void freespace_linkstack(linkstack* stack); // 銷毀棧
#include "linkstack.h"
#include#includelinkstack* init_linkstack()
void push_linkstack(linkstack* stack, linknode* data)
linknode* top_linkstack(linkstack* stack)
void pop_linkstack(linkstack* stack)
int size_linkstack(linkstack* stack)
void clear_linkstack(linkstack* stack)
void freespace_linkstack(linkstack* stack)
棧應用之中綴表示式轉字尾表示式(C語言)
我從網上摘取了幾個思路,這裡的思路在優先順序的比較上大致相同,方法多變,這裡不再一一詳解。1 數字直接輸出 2 遇到左括號直接入棧,遇到右括號將棧中左括號之 棧的運算子全部彈棧輸出,同時左括號出棧但是不輸出。3 遇到乘號和除號直接入棧,直到遇到優先順序比它更低的運算子,依次彈棧。4 遇到加號和減號,...
棧的應用之中綴表示式轉字尾表示式
由於中綴表示式有括號的存在,其運算次序比較複雜,直接分析有些難度。先考慮不帶括號的中綴表示式的轉換。由於運算符號具有不同的優先順序,當前的運算子不能直接放在運算元的後面,需要考慮下乙個運算子的優先順序。對比三個不同的中綴表示式轉換為字尾表示式的結果 可以發現 1.字尾表示式數字的出現順序和中綴表示式...
資料結構 6 棧的應用之中綴表示式求值
參考書籍 資料結構 c語言版 嚴蔚敏 吳偉民編著 清華大學出版社 分析 設操作符棧op棧 運算元棧num棧 op棧裡不可能出現 只可能有 設ch為當前字元,假設輸入都是合法的 1.ch為 則op棧頂為 時ch入棧,否則進行運算直至op棧頂為 2.ch為 則op棧頂為 時ch入棧,否則op棧頂為 此時...