📄 表达式求值).txt
字号:
#include"stdio.h"
#include"stdlib.h"
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct stackf{
char *base;//栈底指针
char *top;//栈顶指针
int stacksize;//保存栈的长度
}sqstack;
typedef struct{
float *base;
float *top;
int stacksize;
}sqstacks;
void initstack(sqstack &s){
s.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
s.stacksize=STACK_INIT_SIZE;
s.top=s.base;
}//对栈进行初始化
void initstacks(sqstacks &s){
s.base=(float *)malloc(STACK_INIT_SIZE*sizeof(float));
s.stacksize=STACK_INIT_SIZE;
s.top=s.base;
}//对栈进行初始化
char gettop(sqstack s){
return *(s.top-1);
}//获取s的栈顶元素
float gettops(sqstacks s){
return *(s.top-1);
}
void push(sqstack &s,char c){
*s.top=c;
s.top++;
}//插入元素e为s的新的栈顶元素
void pushs(sqstacks &s,float f){
*s.top=f;
s.top++;
}
char pop(sqstack &s,char c){
c=gettop(s);
s.top--;
return c;
}//删除s的当前栈顶元素.
float pops(sqstacks &s,float e){
e=gettops(s);
s.top--;
return e;
}
char precede(char c1,char c2){
if(c1=='+'){
switch (c2){
case '+':case '-':case ')':case '#':
return '>';break;
case '*':case '/':case '<':
return '<';break;
}
}
if(c1=='-'){
switch (c2){
case '*':case '/':case '(':
return '<';break;
default:
return '>';break;
}
}
if(c1=='*'){
switch (c2){
case '(':
return '<';break;
default:
return '>';break;
}
}
if(c1=='/'){
switch (c2){
case '(':
return '<';break;
default:
return '>';break;
}
}
if(c1=='('){
switch (c2){
case ')':
return '=';break;
case '+':case '-':case '*':case '/':case '(':
return '<';break;
}
}
if(c1==')'){
switch (c2){
case '+':case '-':case '*':case '/':case ')':case '#':
return '>';break;
}
}
if(c1=='#'){
switch (c2){
case '+':case '-':case '*':case '/':case '(':
return '<';break;
case '#':
return '=';break;
}
}
}//比较符号c1和c2的优先顺序
char pd(char c){
if(c>='0'&&c<='9')
return 's';
else
return 'h';
}//用来判断字符c是数还是字符,如果是数,则返回一个字符s,如果是其他(这里的其他其实就是运算符或者是界限符),则返回h
float operate(float i1,float i2,char h){
switch(h){
case '*':return i1*i2;break;
case '/':return i1/i2;break;
case '+':return i1+i2;break;
case '-':return i1-i2;break;
}
}//将c1和c2对应的数据进行与h对应的操作符运算
float getftos(char c){
float i=float(c-48);
return i;
}//将字符变成数
void creatstack(sqstack &fuhao,sqstacks &shu){
char c;//用来暂存输入的字符
float a,b;
char fu;
char mid;
initstack(fuhao);
push(fuhao,'#');
initstacks(shu);
printf("请输入表达式:");
scanf("%c",&c);
while(c!='#'){
if(pd(c)=='s'){
pushs(shu,getftos(c));//为数时将c直接push到shu栈中
scanf("%c",&c);
}
else{
switch(precede(gettop(fuhao),c)){
case '>':
pops(shu,a);
pops(shu,b);
pop(fuhao,fu);
pushs(shu,operate(a,b,fu));
break;
case '<':
push(fuhao,c);
scanf("%c",&c);
break;
case '=':
pop(fuhao,mid);
scanf("%c",&c);
break;
}
}
}
}
void main(){
sqstack optr;
sqstacks opnd;
creatstack(optr,opnd);
printf("%5.2f\n",gettops(opnd));
}//此程序仍有错误
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -