//順序棧的應用:表示式求值
//允許使用者輸入空格(系統自動刪除),只能進行整數的四則運算,支援小括號
//對不能整除的將按兩個整數除法規則進行取整
#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;
}//**********==運算操作***************=//
opndelem evalueateexpression(const char *expression)
else
switch(precede(gettop_optr(optr),*c))//switch
}//while
gettop_opnd(opnd,&result);
return result;
}void standard(char *expression)while(*q!='\0');
}p++;
}*p++='#';
*p='\0';
}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;
}
棧應用 表示式求值
include stdafx.h include using namespace std const int explenght 20 const int stack init size 20 const int stack incrment 10 templateclass stack stack...
棧應用 表示式求值
include include define length 100 初始分配棧的長度 define add len 10 棧長增量 typedef struct 定義字元棧 sqstack void initstack sqstack s 初始化乙個棧 void push sqstack s,int...
表示式求值 棧的應用
表示式求值 西西設計的機械人卡多掌握了加減法運算以後,最近又學會了一些簡單的函式求值,比如,它 知道函式min 20,23 的值是20 add 10,98 的值是108等等。經過訓練,西西設計的機械人卡多 甚至會計算一種巢狀的更複雜的表示式。假設表示式可以簡單定義為 1.乙個正的十進位制數 x 是乙...