C語言棧的應用之中綴表示式轉化為字尾表示式

2021-09-03 07:12:44 字數 2449 閱讀 7677

完整的演算法需要用到乙個佇列和乙個棧

遍歷中綴表示式,如果遇到運算數,直接把運算數入佇列,如果遇到左括號,將左括號入棧,如果遇到右括號,彈出棧中所有元素加入佇列,直到遇到左括號,如果遇到加減乘除運算子,與棧頂的運算子比較優先順序(注意左括號的優先順序最低),如果棧頂優先順序低於當前的優先順序,直接入棧,若否,彈出當前運算子入佇列,直到棧頂運算子低於當前運算子

#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棧頂為 此時...