qq_40566810 2019-03-24 19:38 采纳率: 0%
浏览 237

跪求大佬帮忙看一下表达式求解问题

在用栈求解表达式时,创建了两个栈,一个为char类型装运算符,一个为double类型装操作数,又写了一个函数把中缀表达式转换为后缀表达式,还有一个函数进行后缀表达式求解,代码如下。在vs上显示没有错误,运行后提示有异常,弄了一下午都没有解决,跪求各位大佬来帮我看看哪里错了,感谢各位大佬。


#include "pch.h"
#include <iostream>
#define Maxsize 50
using namespace std;


//创建一个char栈
typedef struct
    {
        char data[Maxsize];  //存放栈中的数据元素
        int top;      //栈顶指针
    }SqStack;        //顺序栈类型

void InitStack(SqStack * &s)  //初始化栈
    {
        s = (SqStack *)malloc(sizeof(SqStack));
        s->top = -1;
    }

void DestoryStack(SqStack * &s)  //销毁栈
    {
        free(s);
    }

bool StackEmpty(SqStack * s)  //判断栈是否为空
    {
        return(s->top == -1);
    }

bool Push(SqStack * &s, char e)  //进栈
    {
        if (s->top == Maxsize - 1)
            return false;
        s->top++;
        s->data[s->top] = e;
        return true;
    }

bool Pop(SqStack * &s, char &e)  //出栈
    {
        if (s->top == -1)
            return false;
        e = s->data[s->top];
        s->top--;
        return true;
    }

bool GetTop(SqStack * s, char &e)  //取栈顶元素
    {
        if (s->top == -1)
            return false;
        e = s->data[s->top];
        return true;
    }



void trans(char * exp, char postexp[])  //把中缀表达式转换为后缀表达式
{
    char e;
    SqStack * Optr;
    InitStack(Optr);
    int i = 0;
    while (* exp!='\0')   //扫描中缀表达式
    {
        switch (* exp)
        {
        case '(':     //遇到( 进栈
            Push(Optr, ')');
            exp++;
            break;
        case ')':   //遇到 )出栈
            Pop(Optr, e);
            while (e!='(')
            {
                postexp[i++] = e;               
                Pop(Optr, e);           
            }
            exp++;
            break;
        case '+':
        case '-':
            while (!StackEmpty(Optr))
            {
                GetTop(Optr, e);
                if (e != '(')
                {
                    postexp[i++] = e;
                    Pop(Optr, e);
                }
                else
                    break;
            }
            Push(Optr, *exp);
            exp++;
            break;
        case '*':
        case '/':
            while (!StackEmpty(Optr))
            {
                GetTop(Optr, e);
                if (e == '*' || e == '/')
                {
                    postexp[i++] = e;
                    Pop(Optr, e);
                }
                else
                    break;
            }
            Push(Optr, *exp);
            exp++;
            break;
        default:
            while (* exp>='0'&& * exp<='9')
            {
                postexp[i++] = * exp;
                exp++;
            }
            postexp[i++] = '#';
        }
    }
    while (!StackEmpty(Optr))
    {
        Pop(Optr, e);
        postexp[i++] = e;
    }
    postexp[i] = '\0';
    DestoryStack(Optr);
}


//创建一个double栈

typedef struct
{
    double data[Maxsize];  //存放栈中的数据元素
    int top;      //栈顶指针
}SqStack1;

void InitStack1(SqStack1 * &s)  //初始化栈
{
    s = (SqStack1 *)malloc(sizeof(SqStack1));
    s->top = -1;
}

void DestoryStack1(SqStack1 * &s)  //销毁栈
{
    free(s);
}

bool StackEmpty1(SqStack1 * s)  //判断栈是否为空
{
    return(s->top == -1);
}

bool Push1(SqStack1 * &s, double e)  //进栈
{
    if (s->top == Maxsize - 1)
        return false;
    s->top++;
    s->data[s->top] = e;
    return true;
}


bool Pop1(SqStack1 * &s, double &e)  //出栈
{
    if (s->top == -1)
        return false;
    e = s->data[s->top];
    s->top--;
    return true;
}

bool GetTop1(SqStack1 * s, double &e)  //取栈顶元素
{
    if (s->top == -1)
        return false;
    e = s->data[s->top];
    return true;
}


double  compvalue(char * postexp)   //计算后缀表达式
{
    double a, b, c, d, e;
    SqStack1 * Opnd;
    InitStack1(Opnd);
    while (* postexp!='\0')
    {
        switch (* postexp)
        {
        case '+':
            Pop1(Opnd, a);
            Pop1(Opnd, b);
            c = b + a;
            Push1(Opnd, c);
            break;
        case '-':
            Pop1(Opnd, a);
            Pop1(Opnd, b);
            c = b - a;
            Push1(Opnd, c);
            break;
        case '*':
            Pop1(Opnd, a);
            Pop1(Opnd, b);
            c = b * a;
            Push1(Opnd, c);
            break;
        case '/':
            Pop1(Opnd, a);
            Pop1(Opnd, b);
            if (a != 0)
            {
                c = b / a;
                Push1(Opnd, c);
                break;
            }
            else
            {
                cout << "除零错误!" << endl;
                exit(0);
            }
        default:
            d = 0;
            while (* postexp>='0'&& * postexp<='9')
            {
                d = 10 * d + *postexp - '0';
                postexp++;
            }
            Push1(Opnd, d);
            break;
        }
        postexp++;
    }
    GetTop1(Opnd, e);
    DestoryStack1(Opnd);
    return e;
}

int main()
{    
    char exp[] = "(56-20)/(4+2)";
    char postexp[Maxsize];
    trans(exp, postexp);
    cout << exp << endl;
    cout << postexp << endl;
    cout << compvalue(postexp) << endl;
}


  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-09 15:35
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)
  • ¥15 keil里为什么main.c定义的函数在it.c调用不了
  • ¥50 切换TabTip键盘的输入法
  • ¥15 可否在不同线程中调用封装数据库操作的类
  • ¥15 微带串馈天线阵列每个阵元宽度计算