这道题不难,但是当你认真去编代码的时候,还是要考虑好多细节,所以不能只停留在看懂的层面上,不去实践你永远不知道你到底掌握了没有,加油!
之前的表达式求值不包括括号运算,现将改进后的代码和源代码粘在上面,便于以后的复习。
一.不包括括号运算
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<math.h>
#define STACK_INIT_SIZE 100
using namespace std;
typedef struct
{
char date[STACK_INIT_SIZE];
int top;
}OptrStack; //操作符结构体
typedef struct
{
double date[STACK_INIT_SIZE];
int top;
}OpndStack; //操作数结构体
//操作符相关操作
OptrStack *Init_OptrStack(); //置栈空
int Empty_OptrStack(OptrStack *s);//判空栈
int Push_OptrStack(OptrStack *s, char x);//入栈(注意:判断栈是否已满)
char Pop_OptrStack(OptrStack *s, char x);//出栈(注意:判断栈是否已空)
char GetTop_OptrStack(OptrStack *s, char x);//取栈顶元素,先判空
//操作数相关操作
OpndStack *Init_OpndStack();//置栈空
int Empty_OpndStack(OpndStack *t);//判空栈
int Push_OpndStack(OpndStack *t, double y);//入栈(注意:判断栈是否已满)
double Pop_OpndStack(OpndStack *t, double y);//出栈(注意:判断栈是否已空)
double GetTop_OpndStack(OpndStack *t, double y);//取栈顶元素
//表达式求值函数
void Error(char *s); //错误处理函数
int Judge_optr(char ch); //用于判断字符ch是否是运算符
int Operate(int a, int b, char top); //用于计算当前的值,并将该值返回
void Jsbds_operate(char str[]); //读入一个简单算术表达式的值
//操作符函数实现部分
OptrStack *Init_OptrStack()
{
OptrStack *s;
s = (OptrStack *)malloc(sizeof(OptrStack));
s->top = -1;
return s;
}
int Empty_OptrStack(OptrStack *s)//判空栈
{
if (s->top != -1)
return 1;
else
return 0;
}
int Push_OptrStack(OptrStack *s, char x)//入栈(注意:判断栈是否已满)
{
if (s->top == (STACK_INIT_SIZE - 1))
{
return 0;
}
else
s->date[++s->top] = x;
return 1;
}
char Pop_OptrStack(OptrStack *s, char x)//出栈(注意:判断栈是否已空)
{
if (!Empty_OptrStack(s))
{
return 0;
}
else
x = s->date[s->top];
s->top--;
return x;
}
char GetTop_OptrStack(OptrStack *s, char x)//取栈顶元素,先判空
{
if (!Empty_OptrStack(s))
{
return 0;
}
else
x = s->dat