C++ 如何使用堆栈c计算算术表达式?
到现在为止,我刚刚完成表达式转换为后缀表达式,我尝试计算,但出现了一些错误,让我困惑了很长时间,我只知道如何修复它 这是我的代码转换为后缀表达式:C++ 如何使用堆栈c计算算术表达式?,c++,c,stack,C++,C,Stack,到现在为止,我刚刚完成表达式转换为后缀表达式,我尝试计算,但出现了一些错误,让我困惑了很长时间,我只知道如何修复它 这是我的代码转换为后缀表达式: #include <stdio.h> #include <ctype.h> #include <stdlib.h> #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10 #define MAXBUFFER 1
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10
#define MAXBUFFER 10
#define OK 1
#define ERROR 0
typedef char ElemType;
typedef int Status;
typedef struct {
ElemType *base;
ElemType *top;
int stackSize;
}sqStack;
Status InitStack(sqStack *s) {
s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
if ( !s->base ) {
exit(0);
}
s->top = s->base;
s->stackSize = STACK_INIT_SIZE;
return OK;
}
Status Push(sqStack *s, ElemType e) {
//if the stack is full
if ( s->top - s->base >= s->stackSize ) {
s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));
if ( !s->base ) {
exit(0);
}
s->top = s->base + s->stackSize;
s->stackSize += STACKINCREMENT;
}
//store data
*(s->top) = e;
s->top++;
return OK;
}
Status Pop(sqStack *s, ElemType *e) {
if ( s->top == s->base ) {
return ERROR;
}
*e = *--(s->top);
return OK;
}
int StackLen(sqStack s) {
return (s.top - s.base);
}
int main() {
sqStack s;
char c;
char e;
InitStack(&s);
printf("Please input your calculate expression(# to quit):\n");
scanf("%c", &c);
while ( c != '#' ) {
while ( c >= '0' && c <= '9' ) {
printf("%c", c);
scanf("%c", &c);
if ( c < '0' || c > '9' ) {
printf(" ");
}
}
if ( ')' == c ) {
Pop(&s, &e);
while ( '(' != e ) {
printf("%c ", e);
Pop(&s, &e);
}
} else if ( '+' == c || '-' == c ) {
if ( !StackLen(s) ) {
Push(&s, c);
} else {
do {
Pop(&s, &e);
if ( '(' == e ) {
Push(&s, e);
} else {
printf("%c", e);
}
}while ( StackLen(s) && '(' != e );
Push(&s, c);
}
} else if ( '*' == c || '/' == c || '(' == c ) {
Push(&s, c);
} else if ( '#' == c ) {
break;
} else {
printf("\nInput format error!\n");
return -1;
}
scanf("%c", &c);
}
while ( StackLen(s) ) {
Pop(&s, &e);
printf("%c ", e);
}
return 0;
}
#包括
#包括
#包括
#定义堆栈初始大小20
#定义堆栈增量10
#定义MAXBUFFER 10
#定义OK 1
#定义错误0
typedef char ElemType;
类型定义int状态;
类型定义结构{
ElemType*base;
ElemType*top;
整数堆栈大小;
}sqStack;
状态InitStack(sqStack*s){
s->base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));
如果(!s->base){
出口(0);
}
s->top=s->base;
s->stackSize=堆栈初始大小;
返回OK;
}
状态推送(sqStack*s,元素类型e){
//如果堆栈已满
如果(s->top-s->base>=s->stackSize){
s->base=(ElemType*)realloc(s->base,(s->stackSize+STACKINCREMENT)*sizeof(ElemType));
如果(!s->base){
出口(0);
}
s->top=s->base+s->stackSize;
s->stackSize+=STACKINCREMENT;
}
//存储数据
*(s->top)=e;
s->top++;
返回OK;
}
状态Pop(sqStack*s,ElemType*e){
如果(s->top==s->base){
返回误差;
}
*e=*--(s->top);
返回OK;
}
内部堆栈(SQS堆栈){
返回(s.顶部-s.底部);
}
int main(){
SQS;
字符c;
字符e;
InitStack&s;
printf(“请输入您的计算表达式(#退出):\n”);
scanf(“%c”、&c);
而(c!='#'){
而(c>='0'和&c'9'){
printf(“”);
}
}
如果(')'==c){
流行音乐(s&e);
而('('!=e){
printf(“%c”,e);
流行音乐(s&e);
}
}else如果('+'==c | |'-'==c){
如果(!StackLen){
推送(s、c);
}否则{
做{
流行音乐(s&e);
如果('('==e){
推送(s、e);
}否则{
printf(“%c”,e);
}
}而(s)及"("e"),;
推送(s、c);
}
}else如果('*'==c | |'/'==c | |'('==c){
推送(s、c);
}else如果('#'==c){
打破
}否则{
printf(“\n输入格式错误!\n”);
返回-1;
}
scanf(“%c”、&c);
}
而(斯塔克伦){
流行音乐(s&e);
printf(“%c”,e);
}
返回0;
}
当我放入3*(7-2)#
它回来了
372-
事情进展顺利,但我不知道下一步如何计算它,我只是将其转换为后缀表达式,我想使用堆栈对其进行计算。在转换为波兰符号时,您根本没有考虑运算符优先级。很难给出完整的代码,但假设我们沿着
strBuild
构建一个字符串,我就是这样做的
转换为RPN
return Stack.Pop();
弹出计算值并返回。现在,对于您的主要疑问,我没有回答,因为您没有注意到,以下是您如何处理优先级问题:
enum OperatorPrecedence { Add, Minus, Mult, Div, Brackets };
int GetExprPrecedence(string op)
{
int p = 0;
switch (op)
{
case "(":
p = (int)OperatorPrecedence .Brackets;
break;
case "/":
p = (int)OperatorPrecedence .Div;
break;
case "*":
p = (int)OperatorPrecedence .Mult;
break;
case "-":
p = (int)OperatorPrecedence .Minus;
break;
case "+":
p = (int)OperatorPrecedence .Add;
break;
}
return p;
}
请注意,伪代码类似于C-Sharp,因为这是我的工作。我已尽最大努力使其看起来像算法,也不含糊,以便您可以与您的代码联系起来。我的算法的结果:
注:我使用方括号
[
而不是圆括号(
表示我的表达式。最终答案是15。在转换为波兰语符号时,您根本没有考虑运算符优先级。很难给出完整的代码,但假设我们沿着strBuild
构建一个字符串,我就是这样做的
转换为RPN
return Stack.Pop();
弹出计算值并返回。现在,对于您的主要疑问,我没有回答,因为您没有注意到,以下是您如何处理优先级问题:
enum OperatorPrecedence { Add, Minus, Mult, Div, Brackets };
int GetExprPrecedence(string op)
{
int p = 0;
switch (op)
{
case "(":
p = (int)OperatorPrecedence .Brackets;
break;
case "/":
p = (int)OperatorPrecedence .Div;
break;
case "*":
p = (int)OperatorPrecedence .Mult;
break;
case "-":
p = (int)OperatorPrecedence .Minus;
break;
case "+":
p = (int)OperatorPrecedence .Add;
break;
}
return p;
}
请注意,伪代码类似于C-Sharp,因为这是我的工作。我已尽最大努力使其看起来像算法,也不含糊,以便您可以与您的代码联系起来。我的算法的结果:
注:我使用方括号
[
代替圆括号我的表达式是(< /代码>)。最终答案是15。< / P>什么是错误的?你给它输入什么,期望输出是什么,你得到了什么?你尝试了什么,例如调试?请点击描述错误,以及你试图做什么来修复这个问题。也许给我们举一些例子:数据、输出和正确的输出删除C++标签,什么是错误的?什么出错了?你给它输入什么,期望输出是什么,你得到了什么?你尝试了什么,比如调试?请点击描述出错的内容和你试图做的来修复这个问题。也许给我们举一些例子:数据,输出和正确的输出删除C++标签,没有看到的类。
enum OperatorPrecedence { Add, Minus, Mult, Div, Brackets };
int GetExprPrecedence(string op)
{
int p = 0;
switch (op)
{
case "(":
p = (int)OperatorPrecedence .Brackets;
break;
case "/":
p = (int)OperatorPrecedence .Div;
break;
case "*":
p = (int)OperatorPrecedence .Mult;
break;
case "-":
p = (int)OperatorPrecedence .Minus;
break;
case "+":
p = (int)OperatorPrecedence .Add;
break;
}
return p;
}