當(dāng)前位置:
首頁 >
第五周实践项目7 后缀表达式
發(fā)布時(shí)間:2025/4/16
37
豆豆
生活随笔
收集整理的這篇文章主要介紹了
第五周实践项目7 后缀表达式
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
基于棧結(jié)構(gòu),將中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式的算法步驟是:
初始化運(yùn)算符棧op;
將'='進(jìn)棧;從exp讀取字符ch;
while (ch!='\0')
{
? ? if (ch不為運(yùn)算符)
?將后續(xù)的所有數(shù)字均依次存放到postexp中,并以字符'#'標(biāo)志數(shù)值串結(jié)束;
? ? else
? ? ? ?switch(Precede(op棧頂運(yùn)算符,ch))
? ? ? ?{
? ? ? ?case '<': ? //棧頂運(yùn)算符優(yōu)先級低
? ? ? ? ? ? ?將ch進(jìn)棧; ?從exp讀取下字符ch; ?break;
? ? ? ?case '=': ? //只有棧頂運(yùn)算符為'(',ch為')'的情況
? ? ? ? ? ? ?退棧; 從exp讀取下字符ch; break;
? ? ? ?case '>': ? ?//棧頂運(yùn)算符應(yīng)先執(zhí)行,所以出棧并存放到postexp中
? ? ? ? ? ? ?退棧運(yùn)算符并將其存放到postexp中; break;
? ? ? }
}
/* *Copyright (c) 2017,煙臺大學(xué)計(jì)算機(jī)與控制工程學(xué)院 *All rights reserved. *文件名稱:項(xiàng)目7-實(shí)現(xiàn)將一個(gè)中綴表達(dá)式轉(zhuǎn)換為對應(yīng)的后綴表達(dá)式的算法。例如,輸入(56-20)/(4+2),輸出后綴表達(dá)式::56#20#-4#2#+/要求在數(shù)字后加# *作 者:邵雪源 *完成日期:2017年12月13日 *版 本 號:v1.0 */ #include <stdio.h> #include <malloc.h> #define MaxOp 7 #define MaxSize 100 typedef char ElemType; typedef struct {ElemType data[MaxSize];int top; //棧指針 } SqStack; //順序棧類型定義 struct //設(shè)定運(yùn)算符優(yōu)先級 {char ch; //運(yùn)算符int pri; //優(yōu)先級 } lpri[]= {{'=',0},{'(',1},{'*',5},{'/',5},{'+',3},{'-',3},{')',6}}, rpri[]= {{'=',0},{'(',6},{'*',4},{'/',4},{'+',2},{'-',2},{')',1}}; void InitStack(SqStack *&s) {s=(SqStack *)malloc(sizeof(SqStack));s->top=-1; } void DestroyStack(SqStack *&s) {free(s); } int StackLength(SqStack *s) //返回棧中元素個(gè)數(shù)——棧長度 {return(s->top+1); } bool StackEmpty(SqStack *s) {return(s->top==-1); } bool Push(SqStack *&s,ElemType e) {if (s->top==MaxSize-1) //棧滿的情況,即棧上溢出return false;s->top++;s->data[s->top]=e;return true; } bool Pop(SqStack *&s,ElemType &e) {if (s->top==-1) //棧為空的情況,即棧下溢出return false;e=s->data[s->top];s->top--;return true; } bool GetTop(SqStack *s,ElemType &e) {if (s->top==-1) //棧為空的情況,即棧下溢出return false;e=s->data[s->top];return true; }void DispStack(SqStack *s) //輸出棧 {int i;for (i=s->top;i>=0;i--)printf("%c ",s->data[i]);printf("\n"); } int leftpri(char op) //求左運(yùn)算符op的優(yōu)先級 {int i;for (i=0; i<MaxOp; i++)if (lpri[i].ch==op)return lpri[i].pri; }int rightpri(char op) //求右運(yùn)算符op的優(yōu)先級 {int i;for (i=0; i<MaxOp; i++)if (rpri[i].ch==op)return rpri[i].pri; } bool InOp(char ch) //判斷ch是否為運(yùn)算符 {if (ch=='(' || ch==')' || ch=='+' || ch=='-'|| ch=='*' || ch=='/')return true;elsereturn false; } int Precede(char op1,char op2) //op1和op2運(yùn)算符優(yōu)先級的比較結(jié)果 {if (leftpri(op1)==rightpri(op2))return 0;else if (leftpri(op1)<rightpri(op2))return -1;elsereturn 1; } void trans(char *exp,char postexp[]) //將算術(shù)表達(dá)式exp轉(zhuǎn)換成后綴表達(dá)式postexp {SqStack *opstack; //定義運(yùn)算符棧int i=0; //i作為postexp的下標(biāo)ElemType ch;InitStack(opstack); //用初始化棧運(yùn)算為棧分配空間,務(wù)必要做Push(opstack, '=');while (*exp!='\0') //exp表達(dá)式未掃描完時(shí)循環(huán){if (!InOp(*exp)) //為數(shù)字字符的情況{while (*exp>='0' && *exp<='9') //判定為數(shù)字{postexp[i++]=*exp;exp++;}postexp[i++]='#'; //用#標(biāo)識一個(gè)數(shù)值串結(jié)束}else //為運(yùn)算符的情況{GetTop(opstack, ch); //取得棧頂?shù)倪\(yùn)算符switch(Precede(ch ,*exp)){case -1: //棧頂運(yùn)算符的優(yōu)先級低:進(jìn)棧Push(opstack, *exp);exp++; //繼續(xù)掃描其他字符break;case 0: //只有括號滿足這種情況Pop(opstack, ch); //將(退棧exp++; //繼續(xù)掃描其他字符break;case 1: //退棧并輸出到postexp中postexp[i++]=ch;Pop(opstack, ch);break;}}} //while (*exp!='\0')Pop(opstack, ch);while (ch!='=')//此時(shí)exp掃描完畢,退棧到'='為止{postexp[i++]=ch;Pop(opstack, ch);}postexp[i]='\0'; //給postexp表達(dá)式添加結(jié)束標(biāo)識DestroyStack(opstack); } int main() {char exp[]="(56-20)/(4+2)"; //可將exp改為鍵盤輸入char postexp[200];trans(exp,postexp);printf("中綴表達(dá)式:%s\n",exp);printf("后綴表達(dá)式:%s\n",postexp);return 0; }總結(jié)
以上是生活随笔為你收集整理的第五周实践项目7 后缀表达式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第五周实践项目6 数制转换(栈)
- 下一篇: 第五周实践项目8 8皇后问题的回溯求解