#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...