数据结构-栈4-栈的应用-中缀转后缀
生活随笔
收集整理的這篇文章主要介紹了
数据结构-栈4-栈的应用-中缀转后缀
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
//碰到數(shù)字直接輸出
//運算符號:與棧頂符號進行優(yōu)先級比較//若棧頂符號優(yōu)先級比運算符號優(yōu)先級低:此符號進棧(括號優(yōu)先級最低)//若棧頂符號優(yōu)先級不低于運算符號優(yōu)先級:將棧頂符號一直彈出并輸出,直到不滿足條件之后進棧
//左括號:直接進棧
//右括號:將棧頂符號彈出并輸出,直到匹配左括號
//最后將所有元素彈出并輸出
#define _CRT_SECURE_NO_WARNINGS
#include"LinkList.c"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>typedef struct MYCHAR {LinkNode node;char* p;
}MyChar;int IsNumber(char c)
{return c >= '0' && c <= '9';
}int IsLeft(char c)
{return c == '(';
}int IsRight(char c)
{return c == ')';
}//判斷是不是運算符號
int IsOperator(char c)
{return c == '+' || c == '-' || c == '*' || c == '/';
}void NumberOpeartor(char* p)
{printf("%c", *p);
}//創(chuàng)建Mychar
MyChar* CreateMyChar(char *p)
{MyChar* mychar = (MyChar *)malloc(sizeof(MyChar));mychar->p = p;return mychar;
}//左括號的操作
void LeftOperator(LinkList* stack, char *p)
{Push_LinkList(stack, (LinkNode*)CreateMyChar(p));
}//右括號操作
void RightOperator(LinkList* stack)
{//先判斷棧中有沒有元素while (Size_LinkList(stack) > 0){MyChar* mychar = (MyChar*)Top_LinkList(stack);//如果匹配到左括號if (IsLeft(*(mychar->p))){Pop_LinkList(stack);break;}//輸出printf("%c", *(mychar->p));//彈出Pop_LinkList(stack);//釋放內(nèi)存free(mychar);}
}//返回運算優(yōu)先級
int GetPriority(char c)
{if (c == '*' || c == '/'){return 2;}if (c == '+' || c == '-'){return 1;}return 0;
}//運算符號的操作
void OperatorOperate(LinkList* stack, char *p)
{//先取出棧頂元素MyChar* mychar = (MyChar*)Top_LinkList(stack);if (mychar == NULL){Push_LinkList(stack, (LinkNode*)CreateMyChar(p));return;}//如果棧頂優(yōu)先級低于當(dāng)前字符優(yōu)先級 直接入棧if (GetPriority(*(mychar->p)) < GetPriority(*p)){Push_LinkList(stack, (LinkNode*)CreateMyChar(p));return;}//如果棧頂符號優(yōu)先級不低于當(dāng)前字符優(yōu)先級else {//while (Size_LinkList(stack) > 0)//{// MyChar* mychar2 = (MyChar*)Top_LinkList(stack);// //如果優(yōu)先級低,當(dāng)前符號入棧// if (GetPriority(*(mychar2->p)) < GetPriority(*p))// {// Push_LinkList(stack, (LinkNode*)CreateMyChar(p));// break;// }// printf("%c", *(mychar2->p));// //彈出// Pop_LinkList(stack);// //釋放// free(mychar2); //}//將第一個獲取的元素輸出并彈出printf("%c", *(mychar->p));Pop_LinkList(stack);//一直比較直到滿足條件while (Size_LinkList(stack) > 0){MyChar* mychar2 = (MyChar*)Top_LinkList(stack);//如果優(yōu)先級低,當(dāng)前符號入棧if (GetPriority(*(mychar2->p)) < GetPriority(*p)){Push_LinkList(stack, (LinkNode*)CreateMyChar(p));break;}printf("%c", *(mychar2->p));//彈出Pop_LinkList(stack);//釋放free(mychar2); }//彈出完畢后最后將符號元素壓入Push_LinkList(stack, (LinkNode*)CreateMyChar(p));}}
int main()
{char* str = "8+(3-1)*5+1-6";char* p = str;LinkList* stack = Init_linkList();while (*p != '\0'){//如果是數(shù)字,直接輸出if (IsNumber(*p)){NumberOpeartor(p);}//如果是左括號,進棧if (IsLeft(*p)){LeftOperator(stack, p);}//如果是右括號,從棧頂彈出元素,直到匹配到左括號if (IsRight(*p)){RightOperator(stack); }//如果是運算符號if (IsOperator(*p)){OperatorOperate(stack, p);}p++;}while (Size_LinkList(stack) > 0){MyChar* mychar = (MyChar*)Top_LinkList(stack);printf("%c", *(mychar->p));Pop_LinkList(stack);free(mychar);}system("pause");return 0;
}
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎
總結(jié)
以上是生活随笔為你收集整理的数据结构-栈4-栈的应用-中缀转后缀的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STL3-MyArray动态数组类模板实
- 下一篇: webUI自动化一元素定位