棧 中綴表示式轉字尾表示式

2021-10-01 04:33:01 字數 3449 閱讀 8110

/**

中綴轉字尾的演算法:

遍歷中綴表示式中的數字和符號:

對於數字:直接輸出

對於符號:

·左括號:進棧

·運算符號:與棧頂符號進行優先比較

若棧頂符號優先順序低:此符號進棧

(預設棧頂若是左括號,則左括號的優先順序最低)

若棧頂符號優先順序高:將棧頂符號彈出(並輸出),直到棧頂的符號優先順序低,然後進棧

·右括號:將棧頂符號彈出(並輸出),直到匹配左括號,左括號也彈出

遍歷結束:將棧中的所有符號彈出(並輸出)

**/#include#include#includetypedef struct linknodelinknode;

typedef struct linkstacklinkstack;

typedef struct mycharmychar;

typedef struct postfixpostfix;

/*******************

********************/

//初始化

linkstack* init_linkstack();

//入棧

void push_linkstack(linkstack* stack,linknode* data);

//返回棧頂元素

void* top_linkstack(linkstack* stack);

//出棧

void pop_linkstack(linkstack* stack);

//判斷是否為空

int isempty_linkstack(linkstack* stack);

//返回棧中元素個數

int size_linkstack(linkstack* stack);

//清空棧

void clear_linkstack(linkstack* stack);

//銷毀

void free_linkstack(linkstack* stack);

/*******************

********************/

//初始化

linkstack* init_linkstack()

//入棧

void push_linkstack(linkstack* stack,linknode* data)

if(data==null)

data->next = stack->head.next;

stack->head.next = data;

stack->size++;

}//返回棧頂元素

void* top_linkstack(linkstack* stack)

if(stack->size==0)

return stack->head.next;

}//出棧

void pop_linkstack(linkstack* stack)

if(stack->size==0)

linknode* pnext = stack->head.next;

stack->head.next = pnext->next;

stack->size--;

}//判斷是否為空

int isempty_linkstack(linkstack* stack)

if(stack->size==0)

else

return -1;

}//返回棧中元素個數

int size_linkstack(linkstack* stack)

if(stack->size==0)

return stack->size;

}//清空棧

void clear_linkstack(linkstack* stack)

stack->head.next = null;

stack->size = 0;

}//銷毀

void free_linkstack(linkstack* stack)

free(stack);

}//判斷是否是數字

int isnumber(char c)

//判斷是否是左括號

int isleft(char c)

//判斷是否是右括號

int isright(char c)

//判斷是否是運算子

int isoperate(char c)

//儲存到字尾表示式中

void preservepos(postfix* str,char* p)

//輸出數字

void numberoperate(char* p,postfix* str)

//返回運算符號的優先順序

int getpriority(char c)

if(c=='+'||c=='-')

return 0;

}//建立mychar

mychar* creatmychar(char* p)

//建立postfix

postfix* creatpostfix()

//左括號的操作

void leftoperate(linkstack* stack,char* p)

//右括號的操作

void rightoperate(linkstack* stack,postfix* str)

preservepos(str,mc->p);

//輸出

printf("%c",*(mc->p));

//彈出

pop_linkstack(stack);

//釋放記憶體

free(mc);

}}//運算符號的操作

void operateoperate(linkstack* stack,char* p,postfix* str)

//如果棧頂優先順序低,當前字元直接入棧

if(getpriority(*(mc1->p))p);

printf("%c",*(mc1->p));

pop_linkstack(stack);

while(size_linkstack(stack)>0)

} free(mc1);

}//將中綴表示式轉換成字尾表示式(字串形式)

char* intopos(char* p)

//如果是左括號

if(isleft(*p))

//如果是運算子

if(isoperate(*p))

//如果是右括號

if(isright(*p))

p++;

} //將剩餘在棧中的運算子都彈出

while(size_linkstack(stack)>0)

return str->poschar;

}void test01()

int main()

中綴表示式轉字尾表示式

using system using system.collections.generic using system.text namespace 中綴表示式轉字尾表示式 class convert public void run top break case case while top 1 st...

中綴表示式轉字尾表示式

將乙個普通的中綴表示式轉換為字尾表示式的一般演算法是 首先需要分配2個棧,乙個作為臨時儲存運算子的棧s1 含乙個結束符號 乙個作為輸入字尾表示式的棧s2 空棧 s1棧可先放入優先順序最低的運算子 注意,中綴式應以此最低優先順序的運算子結束。可指定其他字元,不一定非 不可。從中綴式的左端開始取字元,逐...

中綴表示式轉字尾表示式

演算法 1.設定乙個運算子棧 初始時可以將棧頂運算子置為 2.按順序掃瞄中綴表示式,當輸入為運算元時就將其輸出到字尾表示式中 3.當輸入為運算子時,則比較輸入運算子和棧頂運算子的優先順序。若輸入運算子的優先順序高於棧頂運算子的優先順序,則將輸入運算子入棧 否則,棧頂運算子的優先順序高於或等於輸入運算...