#include
#include
#define ok 1
#define error 0
#define true 1
#define false 0
#define stack_init_size 100
#define stackincrement 10
#define buffersize 256
typedef int status; //函式返回狀態
typedef int opndelem; //運算元元素型別
typedef structopndstack;
typedef char optrelem;//操作符元素型別
typedef structoptrstack;
//**********運算元棧**********===//
status initstack_opnd(opndstack *s);
//構造乙個空棧s
status gettop_opnd(opndstack s,opndelem *e);
//若棧不為空,則用e返回s的棧頂元素,並返回ok;否則返回false
status push_opnd(opndstack *s,opndelem e);
//插入元素e為新的棧頂元素
status pop_opnd(opndstack *s,opndelem *e);
//若棧s不為空,則刪除s的棧頂元素,用e返回其值,並返回ok,否則返回error
//**********操作符棧**********===//
status initstack_optr(optrstack *s);
//構造乙個空棧s
optrelem gettop_optr(optrstack s);
//若棧不為空,則用e返回s的棧頂元素,並返回ok;否則返回false
status push_optr(optrstack *s,optrelem e);
//插入元素e為新的棧頂元素
status pop_optr(optrstack *s,optrelem *e);
//若棧s不為空,則刪除s的棧頂元素,用e返回其值,並返回ok,否則返回error
//**********==運算操作***************=//
void standard(char *expression);
//將表示式標準化
opndelem evalueateexpression(const char *expression);
//算數表示式求值
status isoperator(char c);
//判斷c是否是乙個操作符
char precede(char op1,char op2);
//判斷op1和op2優先順序的高低,返回』>』,』<』,』=』
opndelem operate(opndelem a,optrelem theta,opndelem b);
//對運算元a,b進行theta運算
const char *getopnd(const char *c,opndelem *op);
//獲得以*c開始的運算元,返回後c為操作符
int main()
printf(「please input an expression:\n」);
gets(expression);
//printf(「before standard:%s\n」,expression);
standard(expression);//標準化
//printf(「standard expression:%s\n」,expression);
result=evalueateexpression(expression);
printf(「the result of the expression:%d\n」,result);
return 0;
}//**********運算元棧**********=//
status initstack_opnd(opndstack *s)
s->top=s->base;
s->stacksize=stack_init_size;
return ok;
}status gettop_opnd(opndstack s,opndelem *e)else
}status push_opnd(opndstack *s,opndelem e)
s->top=s->base+s->stacksize;//更改棧頂指標
s->stacksize+=stackincrement;
} *s->top++=e;
return ok;
}status pop_opnd(opndstack *s,opndelem *e)
e=(–s->top);
return ok;
}//**********操作符棧**********=//
status initstack_optr(optrstack *s)
s->top=s->base;
s->stacksize=stack_init_size;
return ok;
} optrelem gettop_optr(optrstack s)else
return e;
}status push_optr(optrstack *s,optrelem e)
s->top=s->base+s->stacksize;//更改棧頂指標
s->stacksize+=stackincrement;
} *s->top++=e;
return ok;
}status pop_optr(optrstack *s,optrelem *e)
e=(–s->top);
return ok;
} void standard(char *expression)while(*q!=』\0』);
} p++;
} *p++=』#』;
*p=』\0』;
puts(p);
}//**********==運算操作***************=//
opndelem evalueateexpression(const char *expression)
else
switch(precede(gettop_optr(optr),*c))//switch
}//while
gettop_opnd(opnd,&result);
return result;
}const char *getopnd(const char *c,opndelem *op)
*op=sum;
//printf("getopnd:%d\n",*op);
return c;status isoperator(char c)
char precede(char op1,char op2)
break;
case 『-『:
switch(op2)
break;
case 『*』:
switch(op2)
break;
case 『/』:
switch(op2)
break;
case 『(『:
switch(op2)
break;
case 『)』:
switch(op2)
break;
case 『#』:
switch(op2)
break;
default:
return 『<』;
break; } }
opndelem operate(opndelem a,optrelem theta,opndelem b)
rs_i=a/b;
break;
default:
printf(「is not a operator.\n」);
break;
} printf(「%d %c %d = %d\n」,a,theta,b,rs_i);
return rs_i;
表示式求值 棧實現
宣告 僅個人小記 演算法思想 一 設定乙個運算子棧,設定乙個字尾表示式字串 二 從左到右依次對中綴表示式中的每個字元ch分別進行一下處理,直至表示式結束 1.若ch是左括號 將其入棧 2.若 ch 是數字,將其後連續若干數字新增到字尾表示式字串之後,在新增空格作為分割符 3.若ch是運算子,先將棧頂...
棧實現表示式計算
讓index 1,並盤算是否掃瞄到expression最後 index if index expression.length 掃瞄完畢,就順序從數棧和符號棧中pop出相應的數和符號,並執行 while true num1 numstack.pop num2 numstack.pop oper ope...
棧實現表示式計算
原理 數 入棧 入棧 運算子出棧,直到 和 匹配 運算子 當前符優先順序 棧頂符優先順序 入棧 當前符優先順序 棧頂符優先順序 棧內運算子出棧,運算後進棧,再比較 其中 優先順序大於 如下 先建compute.h標頭檔案 pragma once double compute char str 計算 ...