中綴表示式轉為字尾表示式
Status Transform(SqStack *s1,SqStack *s2)
{
//s1為中綴表示式,s2儲存轉化的字尾表示式
char c,data;
printf("輸入中綴表示式,以#為結束標誌");
scanf("%c",&c);
while(c != '#')
{
if(isdigit(c))
{
//如果為數字壓棧s2
pushStack(&s2,c);
}
else if(c == ')')
{
popStack(&s1,&data);
while(data != '(')
{
pushStack(&s2,data);
popStack(&s1,&data);
}
}
else if('+' || '-')
{
//'+''-'優先順序低
if(isEmptyStack(&s1))
{
//如果為空
pushStack(&s2,c);
}
else
{
do
{
popStack(&s1,&data);
if(data == '(')
{
pushStack(&s1,c);
}
else
{
pushStack(&s2,data);
}
}while(isEmptyStack(&s1)|| data == '(');
pushStack(&s1,c);
}
}
else if(c == '*'||c=='/'||c=='(')
{
pushStack(&s1,c);
}
else
{
printf("出錯");
return ERROR;
}
}
}
複製程式碼
字尾表示式的計算
用棧來進出運算的數字
1.從左到右遍歷中綴表示式的每一個數字和符號
2.若是數字,則進棧
3.若是符號,則把處於棧頂的兩個數字出棧,進行運算
4.運算結果進棧
5.直到獲得最終結果
Status calculate(SqStack *s2)
{
char c=0;
int i;
double d,e;
char str[20];
c = *++(s2->base);//從棧底讀取字尾表示式
while(c != '#')
{
while ( isdigit(c) || c == '.')
{
//過濾數字,剩下操作符
str[i++] = c;
str[i] = '\0';//atof處理字串
if(i >= 20){
printf("資料過大\n");
return ERROR;
}
scanf("%c",&c);
if( c == ' ')
{
//讀到空格
d = atof(str);
pushStack(&s2, d);
i = 0;
break;
}
}
switch(c)
{
case '+':
popStack(&s2,&e);
popStack(&s2,&e);
pushStack(&s2, d+e);
break;
case '-':
popStack(&s2,&e);
popStack(&s2,&d);
pushStack(&s2, d-e);//先入棧作被減數
break;
case '*' :
popStack(&s2,&e);
popStack(&s2,&e);
pushStack(&s2, d*e);
break;
case '/':
popStack(&s2,&e);
popStack(&s2,&e);
if(e!=0) pushStack(&s2, d/e);
else
{
printf("除數為0");
return ERROR;
}
break;
}
c = *++(s2->base);
}
c = *++(s2->base);
printf("計算結果為:%f\n",d);
}
複製程式碼