int evaluateExpression(char exp[]) { sqstack OPND,OPTR; dataType a,b,theta,x,X1,X2; char ch; int i=0; create(&OPND); create(&OPTR); push_in(&OPTR,'='); ch=exp[i++]; while(ch!='='||GetTop(&OPTR)!='=') { if(In(ch)) { switch(Precede(GetTop(&OPTR),ch)) { case'<': push_in(&OPTR,ch); ch=exp[i++]; break; case'>': pop_out(&OPTR,&theta); pop_out(&OPND,&b); pop_out(&OPND,&a); push_in(&OPND,Operate(a,theta,b)); break; case'=': pop_out(&OPTR,&x); ch=exp[i++]; break; } } else if(isdigit(ch)) { X1=ch-'0'; push_in(&OPND,X1); X2=X1; ch=exp[i++]; while(isdigit(ch)) { X1=ch-'0'; X2=10*X2+X1; pop_out(&OPND,&x); push_in(&OPND,X2); ch=exp[i++]; } } else if(ch==' ') { while(ch==' ') { ch=exp[i++]; } } else { exit(0); } } return(GetTop(&OPND)); } void menu(){ printf("1.建立顺序表\n"); printf("2.入栈\n"); printf("3.出栈\n"); printf("4.取栈顶元素\n"); printf("5.表达式求值\n"); }
时间: 2023-06-13 17:08:08 浏览: 67
这段代码实现了一个基于栈的表达式求值算法。算法使用两个栈OPND和OPTR,OPND用来存储操作数,OPTR用来存储运算符和括号。
函数evaluateExpression的参数exp为一个表达式字符串,函数返回表达式求值的结果。函数中使用了三个变量a、b、theta来记录操作数和运算符,x来记录栈顶元素,ch为当前字符,i为字符位置指针,X1、X2用来记录多位数字的值。函数中还调用了两个辅助函数In和Precede,用来判断运算符优先级和是否为合法运算符。
函数menu是一个简单的菜单函数,用来展示可供选择的操作。
需要注意的是,代码中的数据类型dataType没有给出具体定义,需要根据上下文来确定。同时,代码中没有给出函数create、push_in、pop_out、GetTop、Operate、In和Precede的具体实现,需要自行添加或查看其他代码文件中是否有实现。
相关问题
#include <iostream> #define MAXSIZE 100 #define OK 1 #define ERROR 0 #define OVERFLOW -2 using namespace std; typedef struct {//符号栈 char* base; char* top; int stacksize; }SqStack1; int InitStack1(SqStack1& S) {//符号栈初始化 return OK; } int Push1(SqStack1& S, char e) {//符号栈入栈 return OK; } int Pop1(SqStack1& S) {//符号栈出栈 return OK; } char GetTop1(SqStack1 S) {//符号栈取栈顶元素 return ERROR; } typedef struct {//数字栈 double* base; double* top; int stacksize; }SqStack2; int InitStack2(SqStack2& S) {//数字栈初始化 return OK; } int Push2(SqStack2& S, double e) {//数字栈入栈 return OK; } int Pop2(SqStack2& S) {//数字栈出栈 return OK; } double GetTop2(SqStack2 S) {//数字栈取栈顶元素 return ERROR; } double Calculate(double a, char op, double b) {//算术表达式的求值 a在前,b在后 } char Precede(char a, char b) {//比较符号优先级 }
这段代码定义了两个栈,一个用于存储符号,一个用于存储数字。其中,符号栈使用了字符指针实现,数字栈使用了双精度浮点数指针实现。
具体实现过程需要补充完成各个函数的代码,包括符号栈和数字栈的初始化、入栈、出栈和取栈顶元素操作,以及算术表达式的求值和比较符号优先级的函数。
以下是代码的框架:
```c++
#include <iostream>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
using namespace std;
typedef struct {//符号栈
char* base;
char* top;
int stacksize;
}SqStack1;
int InitStack1(SqStack1& S) {//符号栈初始化
return OK;
}
int Push1(SqStack1& S, char e) {//符号栈入栈
return OK;
}
int Pop1(SqStack1& S) {//符号栈出栈
return OK;
}
char GetTop1(SqStack1 S) {//符号栈取栈顶元素
return ERROR;
}
typedef struct {//数字栈
double* base;
double* top;
int stacksize;
}SqStack2;
int InitStack2(SqStack2& S) {//数字栈初始化
return OK;
}
int Push2(SqStack2& S, double e) {//数字栈入栈
return OK;
}
int Pop2(SqStack2& S) {//数字栈出栈
return OK;
}
double GetTop2(SqStack2 S) {//数字栈取栈顶元素
return ERROR;
}
double Calculate(double a, char op, double b) {//算术表达式的求值
//a在前,b在后
}
char Precede(char a, char b) {//比较符号优先级
}
int main() {
SqStack1 optr;
SqStack2 opnd;
InitStack1(optr); //初始化符号栈
InitStack2(opnd); //初始化数字栈
//读入中缀表达式
//转换为后缀表达式
//遍历后缀表达式求值
return 0;
}
```
#include <stdio.h> #include <stdlib.h> #include <ctype.h> #define Maxsize 100 using namespace std; typedef int dataType; typedef struct Stack { dataType *top; dataType *base; int stacksize; }sqstack; void create(sqstack *s) { s->base=(dataType *)malloc(Maxsize*sizeof(dataType)); if(!s->base) { return; } s->top=s->base; s->stacksize=Maxsize; return; } int push_in(sqstack *s,dataType value) { if(s->top-s->base==s->stacksize) { return 0; } *s->top++=value; return 1; } int pop_out(sqstack *s,dataType *elem) { if(s->base==s->top) { return 0; } *elem=*--s->top; return 1; } dataType GetTop(sqstack *s) { if(s->base==s->top) { return 0; } return *(s->top-1); } char Precede(char theta1,char theta2) { int i,j; char pre[7][7]={// + - * / ( ) = {'>','>','<','<','<','>','>'}, {'>','>','<','<','<','>','>'}, {'>','>','>','>','<','>','>'}, {'>','>','>','>','<','>','>'}, {'<','<','<','<','<','=','0'}, {'>','>','>','>','0','>','>'}, {'<','<','<','<','<','0','='}}; switch(theta1){ case '+': i=0; break; case '-': i=1; break; case '*': i=2; break; case '/': i=3; break; case '(': i=4; break; case ')': i=5; break; case '=': i=6; break; } switch(theta2){ case '+': j=0; break; case '-': j=1; break; case '*': j=2; break; case '/': j=3; break; case '(': j=4; break; case ')': j=5; break; case '=': j=6; break; } return(pre[i][j]); } int Operate(int a,char theta,int b) { int result; switch(theta){ case'+':return a+b; case'-':return a-b; case'*':return a*b; case'/': if(b!=0) return a/b; else { printf("Divisor can not Be zero!\n"); exit(0); } } } int In(char c) { switch(c){ cas
e '+': case '-': case '*': case '/': case '(': case ')': case '=': return 1; default: return 0; } } void EvaluateExpression() { sqstack OPTR,OPND; create(&OPTR); push_in(&OPTR,'='); create(&OPND); char c=getchar(); dataType x=0; while(c!='='||GetTop(&OPTR)!='=') { if(!In(c)) { ungetc(c,stdin); scanf("%d",&x); push_in(&OPND,x); } else { switch(Precede(GetTop(&OPTR),c)) { case '<': push_in(&OPTR,c); c=getchar(); break; case '=': pop_out(&OPTR,&c); c=getchar(); break; case '>': char theta; pop_out(&OPTR,&theta); dataType a,b; pop_out(&OPND,&b); pop_out(&OPND,&a); push_in(&OPND,Operate(a,theta,b)); break; } } } printf("%d",GetTop(&OPND)); } int main() { EvaluateExpression(); return 0; }
这段代码是一个简单的表达式求值程序,包括了栈的基本操作,如创建栈、入栈、出栈、取栈顶元素等。其中Precede函数用于比较两个运算符的优先级,Operate函数用于对两个操作数进行计算,In函数用于判断一个字符是否为运算符。EvaluateExpression函数则是主要的表达式求值函数,采用了两个栈,一个用于存储运算符,一个用于存储操作数。整个程序的核心思想是利用栈来实现中缀表达式的转换和求值。
阅读全文