/**
中綴轉字尾的演算法:
遍歷中綴表示式中的數字和符號:
對於數字:直接輸出
對於符號:
·左括號:進棧
·運算符號:與棧頂符號進行優先比較
若棧頂符號優先順序低:此符號進棧
(預設棧頂若是左括號,則左括號的優先順序最低)
若棧頂符號優先順序高:將棧頂符號彈出(並輸出),直到棧頂的符號優先順序低,然後進棧
·右括號:將棧頂符號彈出(並輸出),直到匹配左括號,左括號也彈出
遍歷結束:將棧中的所有符號彈出(並輸出)
**/#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.當輸入為運算子時,則比較輸入運算子和棧頂運算子的優先順序。若輸入運算子的優先順序高於棧頂運算子的優先順序,則將輸入運算子入棧 否則,棧頂運算子的優先順序高於或等於輸入運算...