#包括
#包括
#include // malloc()等。
#include // INT_MAX等
# include//eof (= z或F6),NULL。
#include // atoi()
#include // eof()
#包括//地板()、天花板()、abs()
#包含//退出()
#包括//CIN cout
//函數結果狀態代碼
#定義真1
#定義假0
#定義OK 1
#定義錯誤0
#定義不可行-1
// #define OVERFLOW -2因為OVERFLOW的值在math.h中已經定義為3,所以刪除了這壹行。
typedef int狀態;// Status是函數的類型,其值是函數的結果狀態碼,如OK等。
typedef int Boolean// Boolean是值為TRUE或FALSE的布爾類型。
#定義STACK_INIT_SIZE 100
#定義堆棧增量10
//***************************************************************************
//堆棧的存儲結構
typedef結構{
//運算符堆棧
char * base
char * top
int stacksize
} sqstack 1;
typedef結構{
//操作數堆棧
float * base
浮動*頂部;
int stacksize
} SqStack2
//***************************************************************************
//下面是操作符棧的基本操作函數
狀態init stack(sqstack 1 & amp;S){
//初始化堆棧
s . base =(char *)malloc(STACK _ INIT _ SIZE * sizeof(char));
如果(!S.base)退出(溢出);
s . top = s . base;
S.stacksize = STACK _ INIT _ SIZE
退貨OK;
}//初始化堆棧
狀態destroy stack(sqstack 1 & amp;S){
//銷毀堆棧s
免費(s . top);
免費(s . base);
退貨OK;
}//DestroyStack
char GetTop(SqStack1 S){
//如果堆棧不為空,返回S的頂部元素,返回OK;否則返回錯誤。
if(S.top==S.base)返回錯誤;
return *(s . top-1);
}//Gettop
狀態推送(sqstack 1 & amp;s,char e){
//插入元素E作為堆棧的新頂部元素。
if(s . top-s . base & gt;=S.stacksize){
//堆棧已滿,額外的存儲空間
S.base=(char *)realloc(S.base,(s . stack size+stack increment)* sizeof(char));
如果(!S.base)退出(溢出);
s . top = s . base+s . stack size;
s . stack size+= stack increment;
}
* s . top++ = e;
退貨OK;
}//推送
狀態彈出(sqstack 1 & amp;s,char & ampe){
//如果堆棧不為空,刪除S的頂部元素,用E返回其值;並返回ok;否則返回錯誤。
if(S.top==S.base)返回錯誤;
e = *(-s . top);
退貨OK;
}//彈出
//***************************************************************************
//下面是操作數堆棧的基本操作函數
狀態初始化堆棧(SqStack2 & ampS){
//初始化堆棧
s . base =(float *)malloc(STACK _ INIT _ SIZE * sizeof(float));
如果(!S.base)退出(溢出);
s . top = s . base;
S.stacksize = STACK _ INIT _ SIZE
退貨OK;
}//初始化堆棧
狀態銷毀堆棧(SqStack2 & ampS){
//銷毀堆棧s
免費(s . top);
免費(s . base);
退貨OK;
}//DestroyStack
float GetTop(SqStack2 S){
//如果堆棧不為空,返回S的頂部元素,返回OK;否則返回錯誤。
if(S.top==S.base)返回錯誤;
return *(s . top-1);
}//Gettop
狀態推送(SqStack2 & amps,float e){
//插入元素E作為堆棧的新頂部元素。
if(s . top-s . base & gt;=S.stacksize){
//堆棧已滿,額外的存儲空間
S.base=(float *)realloc(S.base,(s . stack size+stack increment)* sizeof(float));
如果(!S.base)退出(溢出);
s . top = s . base+s . stack size;
s . stack size+= stack increment;
}
* s . top++ = e;
退貨OK;
}//推送
狀態彈出(SqStack2 & amp標準普爾,浮動& ampe){
//如果堆棧不為空,刪除S的頂部元素,用E返回其值;並返回ok;否則返回錯誤。
if(S.top==S.base)返回錯誤;
e = *(-s . top);
退貨OK;
}//彈出
//***************************************************************************
//以下是相關的運算符判斷函數。
char precend(char A,char B){
//比較運算符A和B的優先關系,以及A和B的範圍僅限於“+”、“-”、“*”、“/”、“(“,”)”、“=”
//返回' >',' & lt','='
開關(A){
案例'+':開關(B){
大小寫“+”:返回“>;”;
大小寫'-':返回' >;';
大小寫' * ':返回' & lt';
案例'/':返回' & lt';
凱斯'^':return ' & lt;';
case“(”:返回“& lt”;
case ')':返回' >;';
case '= ':返回' >;';
默認值:printf("表達式錯誤!\ n ");退出(0);
}
情況'-':開關(B){
大小寫“+”:返回“>;”;
大小寫'-':返回' >;';
大小寫' * ':返回' & lt';
案例'/':返回' & lt';
凱斯'^':return ' & lt;';
case“(”:返回“& lt”;
case ')':返回' >;';
case '= ':返回' >;';
默認值:printf("表達式錯誤!\ n ");退出(0);
}
案例' * ':開關(B){
大小寫“+”:返回“>;”;
大小寫'-':返回' >;';
事例“*”:返回“>”;
案例“/”:返回“>;”;
凱斯'^':return ' & lt;';
case“(”:返回“& lt”;
case ')':返回' >;';
case '= ':返回' >;';
默認值:printf("表達式錯誤!\ n ");退出(0);
}
案例'/':開關(B){
大小寫“+”:返回“>;”;
大小寫'-':返回' >;';
事例“*”:返回“>”;
案例“/”:返回“>;”;
凱斯'^':return ' & lt;';
case“(”:返回“& lt”;
case ')':返回' >;';
case '= ':返回' >;';
默認值:printf("表達式錯誤!\ n ");退出(0);
}
凱斯·'^':switch(b){
大小寫“+”:返回“>;”;
大小寫'-':返回' >;';
事例“*”:返回“>”;
案例“/”:返回“>;”;
案例'^':return“>”;
case“(”:返回“& lt”;
case ')':返回' >;';
case '= ':返回' >;';
默認值:printf("表達式錯誤!\ n ");退出(0);
}
案例'(':開關(B){
大小寫“+”:返回“& lt”;
大小寫'-':返回' & lt';
大小寫' * ':返回' & lt';
案例'/':返回' & lt';
凱斯'^':return ' & lt;';
case“(”:返回“& lt”;
case“)”:返回“=”;
Case '=':printf("表達式錯誤!\ n ");退出(0);
默認值:printf("表達式錯誤!\ n ");退出(0);
}
案例')':開關(B){
大小寫“+”:返回“>;”;
大小寫'-':返回' >;';
事例“*”:返回“>”;
案例“/”:返回“>;”;
案例'^':return“>”;
Case '(':printf("表達式錯誤!\ n ");退出(0);
case ')':返回' >;';
case '= ':返回' >;';
默認值:printf("表達式錯誤!\ n ");退出(0);
}
case '= ':開關(B){
大小寫“+”:返回“& lt”;
大小寫'-':返回' & lt';
大小寫' * ':返回' & lt';
案例'/':返回' & lt';
凱斯'^':return ' & lt;';
case“(”:返回“& lt”;
Case ')':printf("表達式錯誤!\ n ");退出(0);
大小寫“=”:返回“=”;
默認值:printf("表達式錯誤!\ n ");退出(0);
}
默認值:printf("表達式錯誤!\ n ");退出(0);
}
}//前置
狀態不工作(字符c){
//判斷C是否是運算符,如果是則返回TRUE,否則返回FALSE。
開關(c){
大小寫“+”:返回TRUE
大小寫'-':返回TRUE
case“*”:返回TRUE
案例“/”:返回TRUE
案例'^':return真實;
case“(”:返回TRUE
case“)”:返回TRUE
case“=”:返回TRUE
默認值:返回FALSE
}
}//不工作
//***************************************************************************
浮動操作(浮動a,char theta,浮動b){
開關(θ){
case '+':返回a+b;
格'-':返回a-b;
case '* ':返回a * b;
案例“/”:
if(b==0){
Printf("分母不能為0!\ n ");
退出(0);
}
否則返回a/b;
凱斯·'^':
if(a = = 0 & amp;& ampb & lt=0){
printf("0的指數必須大於0!\ n ");
退出(0);
}
否則返回(浮點)pow(a,b);
默認值:printf("表達式錯誤!\ n ");退出(0);
}
}//操作
狀態EvaluateExpression(){
//算術表達式求值
char c,x,theta,prec
//c是每次要讀取的字符,x是括號後多余的括號,theta是運算符,prec是c的前壹個字符。
浮點a,b,結果;//a和B是每次從操作數堆棧中取出要運算的數,結果存儲最終結果。
float cc,flag,ii,MINUS = 1;
//cc存儲字符串轉換成的浮點數,flag用來標記小數點是否已經讀入。
//ii存儲需要減的小數部分的倍數,用減號記錄這個數之前是否有負號。
sqstack 1 OPTR;
SqStack2 OPND
init stack(OPTR);init stack(OPND);
Push(OPTR,' = ');
prec = ' =scanf("%c ",& ampc);
而(c!='='||GetTop(OPTR)!='='){
cc = 0;flag = 0;ii = 10;
if(c = = '-' & amp;& amp(prec = = ' = ' | | prec = = '('){ MINUS =-1;prec = c;scanf("%c ",& ampc);}
//如果壹個“-”前面有“=”(第壹個符號是“-”)或“(”),則是減號,不是負號。
else if(!不工作(c)){
而(!不工作(c)){
if(c & gt;= 48 & amp& ampc & lt=57){
if(flag = = 0)cc = cc * 10+c-48;//小數點前
else if(flag = = 1){ cc = cc+(c-48)/ii;ii * = 10;}//小數點後
Else {printf("小數點錯誤!\ n ");退出(0);}//小數點不對
}
else if(c== ' . ')flag++;//讀取到小數點
Else {printf("表達式錯誤!\ n ");退出(0);}
prec = c;scanf("%c ",& ampc);
}
cc * = minus減= 1;
推送(OPND,cc);
}//如果不是運算符,則進入OPND棧。
其他
switch(precend(GetTop(OPTR),c)){
大小寫' & lt':Push(OPTR,c);prec = c;scanf("%c ",& ampc);打破;//棧頂元素優先級低。
case '=':Pop(OPTR,x);prec = c;scanf("%c ",& ampc);打破;//去掉括號,接收下壹個字符
大小寫“>”://堆棧,將運算結果進行堆棧。
Pop(OPTR,theta);
Pop(OPND,b);Pop(OPND,a);
Push(OPND,Operate(a,theta,b));
打破;
}
}
result = GetTop(OPND);
printf("%f\n ",結果);
//destroy stack(OPTR);
//destroy stack(OPND);
退貨OK;
}//評估表達式
void main(){
printf(" * * * * * * * * * * * * * * * * * * * \ n ");
Printf(" *歡迎使用計算器!* \ n ");
printf(" * * * * * * * * * * * * * * * * * * * \ n ");
Printf("請輸入以" = ":\n)結尾的表達式);
Printf("(支持實數間的加法(+)、減法(-)、乘法(*)、除法(/)、乘方()和單目減法(-))\ n ");
evaluate expression();
退出(0);
}