【栈】实现表达式求值
思路 && 理解 && 注意
给定一串表达式,字符串类型,依次遍历从头开始遍历每一个位置的内容。 第一个数字,第一个运算符先直接往栈里面push(两个不同的栈) 接着走,遇到数push进来,接着走,遇到运算符,和前面那个已经push进栈的运算符进行优先级比较,如果当前运算符优先级大,那就接着push进来,反之,pop出栈,运算前面的式子之和(之后判断运算符栈中是否还有内容,并且当前运算符的优先级是否小于等于已有的运算符,小于等于就接着运算前面的表达式,完成push当前运算符,反之继续往下遍历push…pop…),直到最后一个元素。 注意; 一直发生变化的是rdata-右操作数,所以每次压完运算符找新的右操作数都会将他置空,准备重新赋值。 没有添加括号优先级运算。
expression.h
代码语言:javascript复制#pragma once
#include<iostream>
using namespace std;
#define MAX_SIZE 128
typedef struct _Postion//地图中点的坐标,这个栈中存的元素就是点的坐标
{
int _x;
int _y;
}Postion;
typedef int DataType;
//栈的结构体
typedef struct _Stack
{
DataType* top;
DataType* base;
}Stack;
//栈的初始化
bool initStack(Stack& S)
{
S.base = new DataType[MAX_SIZE];
if (!S.base)
{
return false;
}
S.top = S.base;
return true;
}
//入栈
bool pushStack(Stack& S, DataType data)
{
if (!S.base)
{
return false;
}
if (S.top - S.base == MAX_SIZE)
{
return false;
}
*(S.top) = data;
S.top ;
return true;
}
//出栈
bool popStack(Stack& S, DataType& e)
{
if (S.top == S.base)
{
return false;
}
e = *(--S.top);
return true;
}
//返回栈顶元素
DataType* getTop(Stack& S)
{
if (S.top - S.base == 0)
{
return NULL;
}
//注意何时自增何时不自增
return S.top - 1;//返回栈顶元素的指针
}
//返回栈中元素个数
int getSize(Stack& S)
{
return S.top - S.base;
}
//判断栈是否为空
bool isEmpty(Stack& S)
{
if (S.top == S.base)
{
return true;
}
else
{
return false;
}
}
//销毁栈
void destoryStack(Stack& S)
{
if (S.base)
{
delete[] S.base;
S.top = S.base = NULL;
}
}
experssion.cpp
代码语言:javascript复制#include"expression.h"
#include<iostream>
using namespace std;
//比较 lhs 的优先级是否高于 rhs,rhs 表示栈顶的符号
bool isLarger(const int &lhs, const int &rhs)
{
if ((rhs == ' ' || rhs == '-') && (lhs == '*' || lhs == '/'))
{
return true;
}
return false;
}
//计算左右操作数 运算符 (对运算符求值)
int operate(int left, int right, int op)
{
int result = 0;
switch (op)
{
case ' ':
result = left right;
break;
case '-':
result = left - right;
break;
case '*':
result = left * right;
break;
case '/':
result = left / right;
break;
default:
break;
}
return result;
}
//运算主体
int calculate(string input)
{
Stack data_stack;//操作数堆栈
Stack opt_stack;//运算符堆栈
int status = 0;//0接收左操作数,1接收操作符,2,接收右操作数
//左右操作数
//一直在发生变化的是右操作符
int ldata = 0;
int rdata = 0;
char last_opt = '