?? 3.21.c
字號:
◆3.21③ 假設表達式由單字母變量和雙目四則運
算算符構成。試寫一個算法,將一個通常書寫形式
且書寫正確的表達式轉換為逆波蘭式。
實現(xiàn)下列函數(shù):
char *RPExpression(char *e);
/* 返回表達式e的逆波蘭式 */
Stack是一個已實現(xiàn)的棧。
可使用的相關類型和函數(shù):
typedef char SElemType; // 棧Stack的元素類型
Status InitStack(Stack &s);
Status Push(Stack &s, SElemType e);
Status Pop(Stack &s, SElemType &e);
Status StackEmpty(Stack s);
SElemType Top(Stack s);
char *RPExpression(char *e)
/* 返回表達式e的逆波蘭式 */
{
char *temp,c;
temp=(char*)malloc(strlen(e)*sizeof(char));
int i=0;
Stack SignStack; //SignStack用于存放符號
InitStack(SignStack);
for(;*e!='\0';e++)
{
if((*e!='+')&&(*e!='-')&&(*e!='*')&&(*e!='/')&&(*e!='(')&&(*e!=')'))
{
*(temp+i)=*e;
i++; //非符號直接寫入字符數(shù)組
}
else
{
switch(*e)
{
case '+': //運算優(yōu)先級數(shù)越高越靠棧底
case '-':while(!(StackEmpty(SignStack)) && !(Top(SignStack)=='('))
{
Pop(SignStack,c);
*(temp+i)=c;
i++;
}
Push(SignStack,*e);
break;
case '*':
case '/':if((Top(SignStack)=='*')||(Top(SignStack)=='/'))
{
Pop(SignStack,c);
*(temp+i)=c;
i++;
Push(SignStack,*e);
}
else Push(SignStack,*e);
break;
case '(':Push(SignStack,*e);break;
case ')':while(Top(SignStack)!='(')
{
Pop(SignStack, c);
*(temp+i)=c;
i++;
}
Pop(SignStack, c);
break;
}
}
}
while(!(StackEmpty(SignStack))) //符號全部出棧
{
Pop(SignStack,c);
*(temp+i)=c;
i++;
}
*(temp+i)='\0';
return temp;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -