Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用堆栈c计算算术表达式?_C++_C_Stack - Fatal编程技术网

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;
    }