當前位置:首頁 » 編程語言 » c語言precede函數

c語言precede函數

發布時間: 2025-03-24 11:42:33

『壹』 怎樣用c語言編一個簡單的計算器

//簡單計算器,含加減乘除、乘方運算。
#include
#include
#include // malloc()等
#include // INT_MAX等
#include // EOF(=^Z或F6),NULL
#include // atoi()
#include // eof()
#include // floor(),ceil(),abs()
#include // exit()
#include // cout,cin
// 函數結果狀態代碼
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
// #define OVERFLOW -2 因為在math.h中已定義OVERFLOW的值為3,故去掉此行
typedef int Status; // Status是函數的類型,其值是函數結果狀態代碼,如OK等
typedef int Boolean; // Boolean是布爾類型,其值是TRUE或FALSE

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

//***************************************************************************
//棧的儲存結構

typedef struct{
//運算符棧
char *base;
char *top;
int stacksize;
}SqStack1;

typedef struct{
//運算數棧
float *base;
float *top;
int stacksize;
}SqStack2;

//***************************************************************************
//以下是運算符棧的基本操作函數

Status InitStack(SqStack1 &S){
//初始化一個棧
S.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
if(!S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}//InitStack

Status DestroyStack(SqStack1 &S){
//銷毀棧S
free(S.top);
free(S.base);
return OK;
}//DestroyStack

char GetTop(SqStack1 S){
//若棧不空,則返回S的棧頂元素,並返回OK;否則返回ERROR
if(S.top==S.base)return ERROR;
return *(S.top-1);
}//Gettop

Status Push(SqStack1 &S,char e){
//插入元素e為新的棧頂元素
if(S.top-S.base>=S.stacksize){
//棧滿,追加儲存空間
S.base=(char *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));
if(!S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}//Push

Status Pop(SqStack1 &S,char &e){
//若棧不空,則刪除S的棧頂元素,用e返回其值;並返回OK;否則返回ERROR
if(S.top==S.base)return ERROR;
e=*(--S.top);
return OK;
}//Pop

//***************************************************************************
//以下是運算數棧的基本操作函數

Status InitStack(SqStack2 &S){
//初始化一個棧
S.base=(float *)malloc(STACK_INIT_SIZE*sizeof(float));
if(!S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}//InitStack

Status DestroyStack(SqStack2 &S){
//銷毀棧S
free(S.top);
free(S.base);
return OK;
}//DestroyStack

float GetTop(SqStack2 S){
//若棧不空,則返回S的棧頂元素,並返回OK;否則返回ERROR
if(S.top==S.base)return ERROR;
return *(S.top-1);
}//Gettop

Status Push(SqStack2 &S,float e){
//插入元素e為新的棧頂元素
if(S.top-S.base>=S.stacksize){
//棧滿,追加儲存空間
S.base=(float *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(float));
if(!S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}//Push

Status Pop(SqStack2 &S,float &e){
//若棧不空,則刪除S的棧頂元素,用e返回其值;並返回OK;否則返回ERROR
if(S.top==S.base)return ERROR;
e=*(--S.top);
return OK;
}//Pop

//***************************************************************************
//以下是相關的運算符判斷函數

char Precede(char A,char B){
//比較運算符A, B的優先關系,A,B的范圍僅限於'+','-','*','/','^','(',')','='
//返回'>','<','='
switch(A){
case '+':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '<';
case '/':return '<';
case '^':return '<';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表達式錯誤!\n");exit(0);
}
case '-':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '<';
case '/':return '<';
case '^':return '<';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表達式錯誤!\n");exit(0);
}
case '*':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '>';
case '/':return '>';
case '^':return '<';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表達式錯誤!\n");exit(0);
}
case '/':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '>';
case '/':return '>';
case '^':return '<';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表達式錯誤!\n");exit(0);
}
case '^':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '>';
case '/':return '>';
case '^':return '>';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表達式錯誤!\n");exit(0);
}
case '(':switch(B){
case '+':return '<';
case '-':return '<';
case '*':return '<';
case '/':return '<';
case '^':return '<';
case '(':return '<';
case ')':return '=';
case '=':printf("表達式錯誤!\n");exit(0);
default:printf("表達式錯誤!\n");exit(0);
}
case ')':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '>';
case '/':return '>';
case '^':return '>';
case '(':printf("表達式錯誤!\n");exit(0);
case ')':return '>';
case '=':return '>';
default:printf("表達式錯誤!\n");exit(0);
}
case '=':switch(B){
case '+':return '<';
case '-':return '<';
case '*':return '<';
case '/':return '<';
case '^':return '<';
case '(':return '<';
case ')':printf("表達式錯誤!\n");exit(0);
case '=':return '=';
default:printf("表達式錯誤!\n");exit(0);
}
default:printf("表達式錯誤!\n");exit(0);
}
}//Precede

Status InOP(char c){
//判斷c是否是運算符,是則返回TRUE,否則返回FALSE
switch(c){
case '+':return TRUE;
case '-':return TRUE;
case '*':return TRUE;
case '/':return TRUE;
case '^':return TRUE;
case '(':return TRUE;
case ')':return TRUE;
case '=':return TRUE;
default:return FALSE;
}
}//InOP

//***************************************************************************

float Operate(float a,char theta,float b){
switch(theta){
case '+':return a+b;
case '-':return a-b;
case '*':return a*b;
case '/':
if(b==0){
printf("分母不能為0!\n");
exit(0);
}
else return a/b;
case '^':
if(a==0&&b<=0){
printf("0的指數必須大於0!\n");
exit(0);
}
else return (float)pow(a,b);
default:printf("表達式錯誤!\n");exit(0);
}
}//Operate

Status EvaluateExpression(){
//算術表達式求值
char c,x,theta,prec;
//c是每次讀取的字元,x是存放脫括弧後的多餘的括弧,theta是運算符,prec是c的前一個字元
float a,b,result;//a、b是每次從運算數棧中取出的要進行運算的數,result存放最終結果
float cc,flag,ii,minus=1;
//cc存放由字元串轉化而來的浮點數,flag用於標記是否已讀取過小數點,
//ii存放小數部分需要縮小的倍數,minus用於記錄該數前是否有負號
SqStack1 OPTR;
SqStack2 OPND;
InitStack(OPTR);InitStack(OPND);
Push(OPTR,'=');
prec='=';scanf("%c",&c);
while(c!='='||GetTop(OPTR)!='='){
cc=0;flag=0;ii=10;
if(c=='-'&&(prec=='='||prec=='(')){minus=-1;prec=c;scanf("%c",&c);}
//若某「-」前面是「=」(第一個符號就是「-」)或「(」,則此為負號,不是減號
else if(!InOP(c)){
while(!InOP(c)){
if(c>=48&&c<=57){
if(flag==0)cc=cc*10+c-48;//小數點之前
else if(flag==1){cc=cc+(c-48)/ii;ii*=10;}//小數點之後
else {printf("小數點錯誤!\n");exit(0);}//小數點有錯
}
else if(c=='.')flag++;//讀到小數點
else {printf("表達式錯誤!\n");exit(0);}
prec=c;scanf("%c",&c);
}
cc*=minus;minus=1;
Push(OPND,cc);
}//不是運算符則進OPND棧
else
switch(Precede(GetTop(OPTR),c)){
case '<':Push(OPTR,c);prec=c;scanf("%c",&c);break;//棧頂元素優先順序低
case '=':Pop(OPTR,x);prec=c;scanf("%c",&c);break;//脫括弧並接收下一字元
case '>'://退棧並將運算結果入棧
Pop(OPTR,theta);
Pop(OPND,b);Pop(OPND,a);
Push(OPND,Operate(a,theta,b));
break;
}
}
result=GetTop(OPND);
printf("%f\n",result);
//DestroyStack(OPTR);
//DestroyStack(OPND);
return OK;
}//EvaluateExpression

void main(){
printf(" **********************\n");
printf(" * 歡迎使用計算器! *\n");
printf(" **********************\n");
printf("請輸入表達式,以「=」結束:\n");
printf("(支持實數間的加(+)、減(-)、乘(*)、除(/)、乘方(^)、單目減(-)運算)\n");
EvaluateExpression();
exit (0);
}

『貳』 求解c語言數學表達式(a+b)的解析求值

#include<stdio.h>
#include<stdlib.h> /* atoi() */
#include<math.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 10
#define STACKINCREMENT 2
typedef struct SqStack
{
int *base;
int *top;
int stacksize;
}SqStack;

int InitStack(SqStack &S)
{
S.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
if(!S.base)
printf("輸入錯誤!");
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}

int GetTop(SqStack &S)
{
if(S.top>S.base)
{
return *(S.top-1);

}
else
return ERROR;
}

int Push(SqStack &S,int e)
{
if(S.top-S.base==S.stacksize)
return ERROR;
*S.top++=e;
return OK;
}

int Pop(SqStack &S)
{
if(S.top==S.base)
return ERROR;

return *--S.top;
}

int Precede(int t1,int t2)
{
int f;
switch(t2)
{
case '+':
case '-':if(t1=='('||t1=='=')
f='<';
else
f='>';
break;
case '*':
case '/':if(t1=='*'||t1=='/'||t1==')')
f='>';
else
f='<';
break;
case '(':if(t1==')')
{
printf("ERROR1\n");
exit(ERROR);
}
else
f='<';
break;
case')':if(t1=='(')
f='=';
else if (t1=='=')
{
printf("ERROR1\n");
exit(ERROR);
}
else
f='>';
break;
case '=' :if(t1=='(')
{
printf("ERROR1\n");
exit(ERROR);
}
else if(t1=='=')
f='=';
else
f='>';break;

return f;
}
}
int In(char c)
{
switch(c)
{
case'+':
case'-':
case'*':
case'/':
case'(':
case')':
case'=':return 1;break;
default: return 0;break;
}
}

int Operate(int a,int theta,int b)
{
int c;
switch(theta)
{
case'+':c=a+b;break;
case'-':c=a-b;break;
case'*':c=a*b;break;
case'/':c=a/b;break;

}
return c;
}

int EvaluateExpression()
{
SqStack OPTR,OPND;
int a,b,d,x,theta;
char c;
char z[6];
int i;
int q='=';
InitStack(OPTR);
Push(OPTR,q);
InitStack(OPND);
c=getchar();
x=GetTop(OPTR);
while(c!='='||x!=61)
{
if(In(c))
switch(Precede(x,c))
{
case'<':Push(OPTR,c);
c=getchar();
break;
case'=':c=Pop(OPTR);c=getchar();
break;
case'>':theta=Pop(OPTR);
b=Pop(OPND);a=Pop(OPND);
Push(OPND,Operate(a,theta,b));
c=getchar();break;
}
else if(c>='0'&&c<='9')
{
Push(OPND,c);
}
else
{
printf("ERROR3\n");
exit(ERROR);
}
GetTop(OPTR);
}
c=getchar();
return GetTop(OPND);
}

void main()
{
printf("請輸入算術表達式,負數要用(0-正數)表示,並以=結束\n");
printf("%d\n",EvaluateExpression());
}

『叄』 怎樣用c語言編一個簡單的計算器最簡單的

//簡單計算器,含加減乘除、乘方運算。
#include<string.h>
#include<ctype.h>
#include<malloc.h> // malloc()等
#include<limits.h> // INT_MAX等
#include<stdio.h> // EOF(=^Z或F6),NULL
#include<stdlib.h> // atoi()
#include<io.h> // eof()
#include<math.h> // floor(),ceil(),abs()
#include<process.h> // exit()
#include<iostream.h> // cout,cin
// 函數結果狀態代碼
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
// #define OVERFLOW -2 因為在math.h中已定義OVERFLOW的值為3,故去掉此行
typedef int Status; // Status是函數的類型,其值是函數結果狀態代碼,如OK等
typedef int Boolean; // Boolean是布爾類型,其值是TRUE或FALSE

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

//***************************************************************************
//棧的儲存結構

typedef struct{
//運算符棧
char *base;
char *top;
int stacksize;
}SqStack1;

typedef struct{
//運算數棧
float *base;
float *top;
int stacksize;
}SqStack2;

//***************************************************************************
//以下是運算符棧的基本操作函數

Status InitStack(SqStack1 &S){
//初始化一個棧
S.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
if(!S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}//InitStack

Status DestroyStack(SqStack1 &S){
//銷毀棧S
free(S.top);
free(S.base);
return OK;
}//DestroyStack

char GetTop(SqStack1 S){
//若棧不空,則返回S的棧頂元素,並返回OK;否則返回ERROR
if(S.top==S.base)return ERROR;
return *(S.top-1);
}//Gettop

Status Push(SqStack1 &S,char e){
//插入元素e為新的棧頂元素
if(S.top-S.base>=S.stacksize){
//棧滿,追加儲存空間
S.base=(char *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));
if(!S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}//Push

Status Pop(SqStack1 &S,char &e){
//若棧不空,則刪除S的棧頂元素,用e返回其值;並返回OK;否則返回ERROR
if(S.top==S.base)return ERROR;
e=*(--S.top);
return OK;
}//Pop

//***************************************************************************
//以下是運算數棧的基本操作函數

Status InitStack(SqStack2 &S){
//初始化一個棧
S.base=(float *)malloc(STACK_INIT_SIZE*sizeof(float));
if(!S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}//InitStack

Status DestroyStack(SqStack2 &S){
//銷毀棧S
free(S.top);
free(S.base);
return OK;
}//DestroyStack

float GetTop(SqStack2 S){
//若棧不空,則返回S的棧頂元素,並返回OK;否則返回ERROR
if(S.top==S.base)return ERROR;
return *(S.top-1);
}//Gettop

Status Push(SqStack2 &S,float e){
//插入元素e為新的棧頂元素
if(S.top-S.base>=S.stacksize){
//棧滿,追加儲存空間
S.base=(float *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(float));
if(!S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}//Push

Status Pop(SqStack2 &S,float &e){
//若棧不空,則刪除S的棧頂元素,用e返回其值;並返回OK;否則返回ERROR
if(S.top==S.base)return ERROR;
e=*(--S.top);
return OK;
}//Pop

//***************************************************************************
//以下是相關的運算符判斷函數

char Precede(char A,char B){
//比較運算符A, B的優先關系,A,B的范圍僅限於'+','-','*','/','^','(',')','='
//返回'>','<','='
switch(A){
case '+':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '<';
case '/':return '<';
case '^':return '<';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表達式錯誤!\n");exit(0);
}
case '-':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '<';
case '/':return '<';
case '^':return '<';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表達式錯誤!\n");exit(0);
}
case '*':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '>';
case '/':return '>';
case '^':return '<';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表達式錯誤!\n");exit(0);
}
case '/':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '>';
case '/':return '>';
case '^':return '<';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表達式錯誤!\n");exit(0);
}
case '^':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '>';
case '/':return '>';
case '^':return '>';
case '(':return '<';
case ')':return '>';
case '=':return '>';
default:printf("表達式錯誤!\n");exit(0);
}
case '(':switch(B){
case '+':return '<';
case '-':return '<';
case '*':return '<';
case '/':return '<';
case '^':return '<';
case '(':return '<';
case ')':return '=';
case '=':printf("表達式錯誤!\n");exit(0);
default:printf("表達式錯誤!\n");exit(0);
}
case ')':switch(B){
case '+':return '>';
case '-':return '>';
case '*':return '>';
case '/':return '>';
case '^':return '>';
case '(':printf("表達式錯誤!\n");exit(0);
case ')':return '>';
case '=':return '>';
default:printf("表達式錯誤!\n");exit(0);
}
case '=':switch(B){
case '+':return '<';
case '-':return '<';
case '*':return '<';
case '/':return '<';
case '^':return '<';
case '(':return '<';
case ')':printf("表達式錯誤!\n");exit(0);
case '=':return '=';
default:printf("表達式錯誤!\n");exit(0);
}
default:printf("表達式錯誤!\n");exit(0);
}
}//Precede

Status InOP(char c){
//判斷c是否是運算符,是則返回TRUE,否則返回FALSE
switch(c){
case '+':return TRUE;
case '-':return TRUE;
case '*':return TRUE;
case '/':return TRUE;
case '^':return TRUE;
case '(':return TRUE;
case ')':return TRUE;
case '=':return TRUE;
default:return FALSE;
}
}//InOP

//***************************************************************************

float Operate(float a,char theta,float b){
switch(theta){
case '+':return a+b;
case '-':return a-b;
case '*':return a*b;
case '/':
if(b==0){
printf("分母不能為0!\n");
exit(0);
}
else return a/b;
case '^':
if(a==0&&b<=0){
printf("0的指數必須大於0!\n");
exit(0);
}
else return (float)pow(a,b);
default:printf("表達式錯誤!\n");exit(0);
}
}//Operate

Status EvaluateExpression(){
//算術表達式求值
char c,x,theta,prec;
//c是每次讀取的字元,x是存放脫括弧後的多餘的括弧,theta是運算符,prec是c的前一個字元
float a,b,result;//a、b是每次從運算數棧中取出的要進行運算的數,result存放最終結果
float cc,flag,ii,minus=1;
//cc存放由字元串轉化而來的浮點數,flag用於標記是否已讀取過小數點,
//ii存放小數部分需要縮小的倍數,minus用於記錄該數前是否有負號
SqStack1 OPTR;
SqStack2 OPND;
InitStack(OPTR);InitStack(OPND);
Push(OPTR,'=');
prec='=';scanf("%c",&c);
while(c!='='||GetTop(OPTR)!='='){
cc=0;flag=0;ii=10;
if(c=='-'&&(prec=='='||prec=='(')){minus=-1;prec=c;scanf("%c",&c);}
//若某「-」前面是「=」(第一個符號就是「-」)或「(」,則此為負號,不是減號
else if(!InOP(c)){
while(!InOP(c)){
if(c>=48&&c<=57){
if(flag==0)cc=cc*10+c-48;//小數點之前
else if(flag==1){cc=cc+(c-48)/ii;ii*=10;}//小數點之後
else {printf("小數點錯誤!\n");exit(0);}//小數點有錯
}
else if(c=='.')flag++;//讀到小數點
else {printf("表達式錯誤!\n");exit(0);}
prec=c;scanf("%c",&c);
}
cc*=minus;minus=1;
Push(OPND,cc);
}//不是運算符則進OPND棧
else
switch(Precede(GetTop(OPTR),c)){
case '<':Push(OPTR,c);prec=c;scanf("%c",&c);break;//棧頂元素優先順序低
case '=':Pop(OPTR,x);prec=c;scanf("%c",&c);break;//脫括弧並接收下一字元
case '>'://退棧並將運算結果入棧
Pop(OPTR,theta);
Pop(OPND,b);Pop(OPND,a);
Push(OPND,Operate(a,theta,b));
break;
}
}
result=GetTop(OPND);
printf("%f\n",result);
//DestroyStack(OPTR);
//DestroyStack(OPND);
return OK;
}//EvaluateExpression

void main(){
printf(" **********************\n");
printf(" * 歡迎使用計算器! *\n");
printf(" **********************\n");
printf("請輸入表達式,以「=」結束:\n");
printf("(支持實數間的加(+)、減(-)、乘(*)、除(/)、乘方(^)、單目減(-)運算)\n");
EvaluateExpression();
exit (0);
}

『肆』 求c語言編的四則運算(帶括弧),要有注釋

#include<stdio.h>
#include<stdlib.h>
#define MaxOp 128
#define MaxSize 128
#define Size 128

struct //設定運算符優先順序
{
char ch; //運算符
int pri; //優先順序
}
lpri[]={{'=',0},{'(',1},{'*',5},{'/',5},{'+',3},{'-',3},{')',6}},
rpri[]={{'=',0},{'(',6},{'*',4},{'/',4},{'+',2},{'-',2},{')',1}};
int leftpri(char op) //求左運算符op的優先順序
{
int i;
for(i=0;i<MaxOp;i++)
if(lpri[i].ch==op)
return lpri[i].pri;
}
int rightpri(char op) //求右運算符op的優先順序
{
int i;
for(i=0;i<MaxOp;i++)
if(rpri[i].ch==op)
return rpri[i].pri;
}
int InOp(char ch) //判斷ch是否為運算符
{
if(ch=='('||ch==')'||ch=='+'||ch=='-'||ch=='*'||ch=='/')
return 1;
else
return 0;
}
int Precede(char op1,char op2) //op1和op2運算符優先順序的比較結構
{
if(leftpri(op1)==rightpri(op2))
return 0;
else if(leftpri(op1)<rightpri(op2))
return -1;
else return 1;
}
void trans(char *exp,char postexp[])
//將算術表達式exp轉換為後綴表達式postexp
{
struct
{
char data[MaxSize]; //存放運算符
int top; //棧指針
}op; //定義運算符棧
int i=0; //i作為postexp的下標
op.top=-1;
op.top++; //將'='進棧
op.data[op.top]='=';
while(*exp!='\0') //exp表達式未掃描完時循環
{
if(!InOp(*exp)) //為數字字元的情況
{
while(*exp>='0'&&*exp<='9') //判定為數字
{
postexp[i++]=*exp;
exp++;
}
postexp[i++]='#'; //用#標志一個數值串的結束
}
else
switch(Precede(op.data[op.top],*exp))
{
case -1: //棧頂運算符的優先順序低
op.top++;op.data[op.top]=*exp;
exp++; //繼續掃描其他字元
break;
case 0: // 只有括弧滿足這種情況
op.top--; //將退棧
exp++;
break;
case 1:
postexp[i++]=op.data[op.top];
op.top--;
break;
}
}
while(op.data[op.top]!='=') //此時exp掃描完畢,退棧到'='為止
{
postexp[i++]=op.data[op.top];
op.top--;
}
postexp[i]='\0'; //給postexp表達式添加結束標志
}

float compvalue(char *postexp) //計算後綴表達式postexp的值
{
struct
{
float data[MaxSize]; //存放數值
int top; //棧指針
}st;
float d,a,b,c;
st.top=-1;
while(*postexp!='\0') //postexp字元串未掃描完時循環
{
switch(*postexp)
{
case '+':
a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
c=a+b;
st.top++;
st.data[st.top]=c;
break;
case '-':
a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
c=b-a;
st.top++;
st.data[st.top]=c;
break;
case '*':
a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
c=a*b;
st.top++;
st.data[st.top]=c;
break;
case '/':
a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
if(a!=0)
{
c=b/a;
st.top++;
st.data[st.top]=c;
}
else
{
printf("\n\t除零錯誤! \n");
exit(0);
}
break;
default:
d=0;
while(*postexp>='0'&&*postexp<='9')
{
d=10*d+*postexp-'0';
postexp++;
}
st.top++;
st.data[st.top]=d;
break;
}
postexp++;
}
return(st.data[st.top]);
}
void main()
{
for(;;)
{
char exp[Size];
char postexp[MaxSize];
printf("請輸入表達式:");
gets(exp);
trans(exp,postexp);
printf("中綴表達式: %s\n",exp);
printf("後綴表達式: %s\n",postexp);
printf("表達式的值: %g\n",compvalue(postexp));
}
}

熱點內容
快看漫畫能緩存嗎 發布:2025-03-26 07:00:20 瀏覽:842
雲伺服器怎麼切換到電腦 發布:2025-03-26 07:00:15 瀏覽:904
復制加密IC卡 發布:2025-03-26 06:55:08 瀏覽:885
結果緩存頁 發布:2025-03-26 06:33:58 瀏覽:269
人臉解壓器 發布:2025-03-26 06:25:18 瀏覽:894
sql伺服器安裝 發布:2025-03-26 06:18:41 瀏覽:235
編程在線學習平台 發布:2025-03-26 06:14:25 瀏覽:883
調試程序是指對程序進行編譯嗎 發布:2025-03-26 06:06:15 瀏覽:34
我的世界小游戲伺服器ip地點 發布:2025-03-26 06:05:35 瀏覽:147
wow多玩資料庫 發布:2025-03-26 06:05:34 瀏覽:747