?? zhuanhuan.cpp
字號:
//將中綴表達式轉(zhuǎn)換為后綴表達式的文件zhuanhuan.cpp
const int SM=40;
#include"linearStack1.cpp"
int Precedence(char op);
void zhuanhuan(char s1[SM],char s2[SM])
//將字符串s1中的中綴表達式轉(zhuǎn)換為存于字符串s2中的后綴表達式
{Stack R; //定義用于暫存運算符的棧
R.Push('@'); //給棧底放入'@'字符,它具有最低優(yōu)先級0
int i,j;
i=0; //用于指示掃描s1串中字符的位置,初值為0
j=0; //用于指示s2串中待存字符的位置,初值為0
char ch=s1[i];//ch保存s1串中掃描到的字符,初值為第一個字符
while(ch!='@')
{//順序處理中綴表達式中的每個字符
if(ch==' ')
//對于空格字符不做任何處理,順序讀取下一個字符
ch=s1[++i];
else if(ch=='(')
{R.Push(ch);//對于左括號,直接進棧
ch=s1[++i];}
else if(ch==')')
{//對于右括號,使括號內(nèi)的仍停留在棧中的運算符依次
//出棧并寫入到s2中
while(R.Peek()!='(')
s2[j++]=R.Pop();
R.Pop(); //刪除棧頂?shù)淖罄ㄌ? ch=s1[++i];}
else if(ch=='+'||ch=='-'||ch=='*'||ch=='/')
{//對于四則運算符,使暫存在棧中的不低于ch優(yōu)先級
//的運算符依次出棧并寫入到s2中
char w=R.Peek();
while(Precedence(w)>=Precedence(ch))
{//Precedence(w)函數(shù)返回運算符形參的優(yōu)先級
s2[j++]=w;R.Pop();w=R.Peek();}
R.Push(ch); //把ch運算符寫入棧中
ch=s1[++i];}
else
{//此處必然為數(shù)字或小數(shù)點字符
while(isdigit(ch)||ch=='.')
{//把一個數(shù)值中的每一位依次寫入到s2串中
s2[j++]=ch;
ch=s1[++i];
}
//被轉(zhuǎn)換后的每個數(shù)值后放入一個空格
s2[j++]=' ';}
}
//把暫存在棧中的運算符依次出棧并寫入到s2串中
ch=R.Pop();
while(ch!='@') {
if(ch=='(') {
cerr<<"expression error!"<<endl;
exit(1);}
else {s2[j++]=ch;
ch=R.Pop();}}
//在后綴表達式的末尾放入表達式結(jié)束符和字符串結(jié)束符
s2[j++]='@';
s2[j++]='\0';
}
//求運算符優(yōu)先級的Precedence函數(shù)為:
int Precedence(char op)
//返回運算符op所對應(yīng)的優(yōu)先級數(shù)值
{switch(op)
{case '+':
case '-':return 1;//定義加減運算的優(yōu)先級為1
case '*':
case '/':return 2;//定義乘除運算的優(yōu)先級為2
case '(':
case '@':
//定義在棧中的左括號和棧底字符的優(yōu)先級為0
default:return 0;}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -