#include<malloc.h>
#include<stdio.h>
#include<ctype.h>//判斷是否為字符函數(shù)的頭文件?
#include<stdlib.h>
#define?MAXSIZE?100
typedef?int?boo1;
#define?ture?1
#define?false?0
typedef?int?elemtype;
char?ch[7]={'+','-','*','/','(',')','#'};//把符號(hào)轉(zhuǎn)換成一個(gè)字符數(shù)組?
int?f1[7]={3,3,5,5,1,6,0};//棧內(nèi)元素優(yōu)先級(jí)?
int?f2[7]={2,2,4,4,6,1,0};//棧外元素優(yōu)先級(jí)?
int?n=0;
typedef?struct?sqstack
{//順序結(jié)構(gòu)
????elemtype?stack[MAXSIZE];
int?top;?
}sqstack;
//1.把操作的字符轉(zhuǎn)化成相應(yīng)的字符。?
elemtype?cton(char?c)
{?
switch(c)
{
case?'+':?return?0;?
case?'-':?return?1;
case?'*':?return?2;
case?'/':?return?3;
case?'(':?return?4;
case?')':?return?5;
default:??return?6;
}
}?
?//2.按設(shè)定比較兩個(gè)字符的優(yōu)先級(jí)。?
?char?Compare(char?c1,char?c2)
?{
? int?i1=cton(c1);
? int?i2=cton(c2);//把字符變成數(shù)字?
? if(f1[i1]>f2[i2])??return?'>';//通過原來的設(shè)定找到優(yōu)先級(jí)
else?if(f1[i1]<f2[i2])??return?'<';
else?return?'=';
}//end?Compare
//3.進(jìn)行四則運(yùn)算,并返回計(jì)算結(jié)果。?
int?Operate(elemtype?a,elemtype?t,elemtype?b)
{
int?sum;
switch(t)
{
case?0:?sum=a+b;?break;
case?1:?sum=a-b;?break;
case?2:?sum=a*b;?break;
default:?sum=a/b;
}
return?sum;
?}?
//4.主要的表達(dá)式計(jì)算函數(shù),返回表達(dá)式的計(jì)算結(jié)果。?
int?EvaluateExpression()
? char?c;
? int?i=0,sum=0;
? int?k=1,j=1;//設(shè)置了開關(guān)變量?
? elemtype?x,t,a,b;
? sqstack?OPTR,OPND;
? Initstack(&OPTR);//初始化操作符棧
Push(&OPTR,cton('#'));//#符號(hào)壓入操作符棧
Initstack(&OPND);//初始化操作數(shù)棧
c=getchar();
while(c!='#'||ch[Gettop(OPTR)]!='#')
{
if(isdigit(c))
{
sum=0;
while(isdigit(c))//判斷c是否為數(shù)字?
{
if(!j)//j用來進(jìn)行數(shù)字串的轉(zhuǎn)換判斷,j為0轉(zhuǎn)換
{
????sum=sum*10-(c-'0');
}?
else?sum=sum*10+(c-'0');//字符c轉(zhuǎn)換成了對(duì)應(yīng)的數(shù)字
?c=getchar();
}//當(dāng)前c不為數(shù)字,則把之前的數(shù)字串轉(zhuǎn)化成十進(jìn)制數(shù)字再壓棧
Push(&OPND,sum);
j=1;?
}
else?if(k)
{
switch(Compare(ch[Gettop(OPTR)],c))
{
case'<':Push(&OPTR,cton(c));//把字符整型化,然后入操作棧
????????c=getchar();
break;
case'=':Pop(&OPTR,&x);//操作符棧頂元素出棧?
????????c=getchar();
break;
case'>':Pop(&OPTR,&t);//操作符棧棧頂元素出棧?
Pop(&OPND,&b);//操作數(shù)棧棧頂元素出棧
Pop(&OPND,&a);//操作數(shù)棧棧頂元素出棧
Push(&OPND,Operate(a,t,b));
break; ?
}
}
}//endwhile
return(Gettop(OPND));?
???//endEvaluateExpression
//5.取棧頂元素
elemtype??Gettop(sqstack?s)
{?
if(s.top==0)
{
printf("ERROR,underflow\n");?return?0;
}
else
return?s.stack[s.top];
}???
//6.初始化棧
void?Initstack(sqstack*s)
{
s->top=0;
}?
//7.出棧
void?Pop(sqstack*s,elemtype*x)
{
if(s->top==0)
printf("ERROR,Underflow!\n");
else
{
*x=s->stack[s->top];
s->top--;
}
}
//8.入棧
void?Push(sqstack*s,elemtype?x)
{
if(s->top==MAXSIZE-1)
printf("ERROR,Overflow!\n");
else
{
s->top++;
s->stack[s->top]=x;
}
}//end?Push
//9.若S為空棧,則返回TURE,否則返回FALSE
bool?StackEmpty(sqstack?S)
{
if(S.top==0)?return?ture;
else?return?false;
}
//10.主函數(shù)。設(shè)定界面的顏色大小,調(diào)用計(jì)算模塊函數(shù)
main()
{
int?result;
system("color?1f");
system("mode?con:cols=80?lines=35");
printf("************歡迎使用表達(dá)式求值小程序************\n\n");
printf("請(qǐng)輸入您的算術(shù)表達(dá)式(以#號(hào)結(jié)束):");
result=EvaluateExpression();
printf("表達(dá)式的計(jì)算結(jié)果是:%d",result);
printf("************感謝您的使用,再見!************\n\n");
// return?0;
}這個(gè)編程的第57行一直顯示有2個(gè)錯(cuò)誤和一個(gè)警告,有沒有大神幫我看下!!
- 1 回答
- 0 關(guān)注
- 1200 瀏覽