棧運用 中綴表示式轉化為字尾表示式 C語言

2021-09-26 23:38:58 字數 2365 閱讀 4722

#define stack_init_size 20

#define stackincrement 10

typedef char elemtype;//

typedef struct

sqstack;

void initstack(sqstack *s)

void push(sqstack *s,elemtype e)

*(s->top)=e;

s->top++;

}void pop(sqstack *s,elemtype *e)

//會對棧進行修改則傳位址,不修改只是做測試等操作則只傳資料即可

int stacklen(sqstack s)//這裡傳進來的是結構不是指標

int main()

}if(')'==c)//左右括號匹配,彈棧

}else if('+'==c||'-'==c)/**有新符號入棧時,若符號是右括號或優先順序小於等於棧頂元素,這裡的c是新符號,e是棧內的符號

則棧頂元素依次出棧並輸出,直到遇到左括號或棧空,新符號再入棧 **/

else

else

}while(stacklen(s)&&'('!=e);//判斷是否為空,是否等於左括號

push(&s,c);}}

else if('*'==c||'/'==c||'('!=e)

else if('#'==c)

else

scanf("%c",&c);

}while(stacklen(s))//不空則彈棧

return 0;

}//整體左右括號未列印出來,因為迴圈語句和條件語句的限制條件都是!=左括號或右括號

網上找的 大致思路一樣 但更簡潔明白:

a.數字直接輸出

b.運算子

情況一:遇到左括號直接入棧,遇到右括號將棧中左括號之**棧的運算子全部彈棧輸出,同時左括號出棧但是不輸出。

情況二:遇到乘號和除號直接入棧,直到遇到優先順序比它更低的運算子,依次彈棧。

情況三:遇到加號和減號,如果此時棧空,則直接入棧,否則,將棧中優先順序高的運算子依次彈棧(注意:加號和減號屬於同乙個優先順序,所以也依次彈棧)直到棧空或則遇到左括號為止,停止彈棧。(因為左括號要匹配右括號時才彈出)。

情況四:獲取完後,將棧中剩餘的運算符號依次彈棧輸出

#include#include#include#include#define initsize  20

#define increment 10

#define maxbuffer 20

#define len sizeof(elemtype)

/*棧的動態分配儲存結構*/

typedef char elemtype;

typedef structsqstack;

/*初始化棧*/

void initstack(sqstack *s)

/*壓棧操作*/

void pushstack(sqstack *s,elemtype c)

*s->top++ = c;

}/*求棧長*/

int stacklength(sqstack *s)

/*彈棧操作*/

int popstack(sqstack *s,elemtype *c)

*c=*--s->top;

return 1;

}/*中綴轉字尾函式*/

void change(sqstack *s,elemtype str)

} /*加減運算子優先順序最低,如果棧頂元素為空則直接入棧,否則將棧中儲存

的運算子全部彈棧,如果遇到左括號則停止,將彈出的左括號從新壓棧,因為左

括號要和又括號匹配時彈出,這個後面單獨討論。彈出後將優先順序低的運算子壓入棧中*/

if(str[i]=='+'||str[i]=='-')

else

else

}while( stacklength(s) && e != '(' );

pushstack(s,str[i]);

}} /*當遇到右括號是,把括號裡剩餘的運算子彈出,直到匹配到左括號為止

左括號只彈出不列印(右括號也不壓棧)*/

else if(str[i]==')')

}/*乘、除、左括號都是優先順序高的,直接壓棧*/

else if(str[i]=='*'||str[i]=='/'||str[i]=='(')

else if(str[i]=='\0')

else

i++;

} /*最後把棧中剩餘的運算子依次彈棧列印*/

while(stacklength(s)) }

int main()

中綴表示式轉化為字尾表示式

注意 中綴表示式需要空格隔開運算元或者操作符 關鍵有 判斷是否操作符,操作符優先順序 public class profixexpression 計算排好的字尾操作計算式 param prostr return public static intprofixcalculate string pros...

中綴表示式轉化為字尾表示式

中綴表示式轉化為字尾表示式有兩種方法,一種是利用棧,一種是把表示式轉化為樹再進一步求解,今天我們來深入了解一下這兩種方法 給出下面乙個例子 我們把中綴表示式 9 3 1 3 10 2 轉化為字尾表示式 1.首先初始化乙個空棧,用來對符號進出棧使用 2.第乙個字元是數字9,輸出9,將後面的符號 進棧 ...

中綴表示式轉化為字尾表示式

中綴表示式轉化為字尾表示式 例如 1 2 3 4 7 5 123 4 75 1 遇到數字輸出,否則進棧。2 遇到有右括號匹配棧裡的左括號,輸出棧裡的內容 3 遇到比自己比棧裡的運算子優先順序高,入棧 4 遇到比自己比棧裡的運算子優先順序低,將棧裡的運算子出棧 include include incl...