表达式求值
github仓库:https://github.com/EanoJiang/Data-structures-and-algorithms栈——表达式求值
枚举
typedef enum{
枚举元素;
}枚举名;后缀表达式运算逻辑
遇到数字入栈,遇到符号出栈运算,运算结果入栈,\0结束
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
#define MAXSIZE 100
typedef struct Stack{
int top;
ElemType *data;
}Stack;
// 初始化栈
Stack* initStack(){
Stack *s = (Stack*)malloc(sizeof(Stack));
s->data = (ElemType*)malloc(MAXSIZE * sizeof(ElemType));
s->top = -1;
return s;
}
int isEmpty(Stack* s){
return s->top == -1;
}
//入栈
int push(Stack *s, ElemType e){
if(s->top == MAXSIZE-1){
printf("栈满\n");
return 0;
}
s->top++;
//从栈顶入栈
s->data = e;
return 1;
}
//出栈
ElemType pop(Stack *s,ElemType *e){
if(s->top == -1){
printf("栈空\n");
return 0;
}
*e = s->data;
s->top--;
return *e;
}
//查看栈顶元素
ElemType getTop(Stack *s,ElemType *e){
if(s->top == -1){
printf("栈空\n");
return 0;
}
*e = s->data;
return *e;
}
typedef enum {
LEFT_PARE,RIGHT_PARE,
ADD,SUB,MUL,DIV,MOD,
EOS,NUM
}contentType;
char expr[] = "82/2+56*-";
contentType getToken(char *symbol,int *index){
//存储当前字符
*symbol = expr[*index];
//这句不能写成*index++:指针*index的地址自增
*index = *index + 1;//指针*index的值自增
switch(*symbol){
case '(':
return LEFT_PARE;
case ')':
return RIGHT_PARE;
case '+':
return ADD;
case '-':
return SUB;
case '*':
return MUL;
case '/':
return DIV;
case '%':
return MOD;
case '\0':
return EOS;
default:
if(*symbol >= '0' && *symbol <= '9'){
return NUM;
}
else{
printf("非法字符\n");
return -1;
}
}
}
//计算后缀表达式
int eval(Stack *s){
char symbol;
int op1,op2;
int index = 0;
ElemType result;
contentType token;
token = getToken(&symbol,&index);
//结束条件\0
while(token!= EOS){
//遇到数字
if(token == NUM){
//将数字(字符相应ASCII码-'0')压入栈中
push(s,symbol - '0');
}
//遇到操作符
else{
//出栈,把被操作数存到op2和op1中
pop(s,&op2);
pop(s,&op1);
//计算结果入栈
switch(token){
case ADD:
push(s,op1 + op2);
break;
case SUB:
push(s,op1 - op2);
break;
case MUL:
push(s,op1 * op2);
break;
case DIV:
push(s,op1 / op2);
break;
case MOD:
push(s,op1 % op2);
break;
default:
printf("非法字符\n");
return 0;
}
}
//更新token
token = getToken(&symbol,&index);
}
//循环结束条件\0后,栈中只有一个元素,出栈并打印
pop(s,&result);
printf("结果为:%d\n",result);
return 1;
}
int main(){
Stack *s = initStack();
eval(s);
return 0;
}
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]