Locky67 2021-12-26 18:37 采纳率: 100%
浏览 35
已结题

表达式求值,自己写的代码,不知道哪里出错了

想要的是这个结果

img


但是却卡在了这

img


这是我的代码


#include<stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

#define MAXSIZE 100
#define OPSIZE 7
#define ERROR 0
#define OK 1
#define OVERFLOW -2

typedef int SElemType;
typedef char OperandType;
typedef int Status;

unsigned char Prior[7][7] = {
    '>','>','<','<','<','>','>',
    '>','>','<','<','<','>','>',
    '>','>','>','>','<','>','>',
    '>','>','>','>','<','>','>',
    '<','<','<','<','<','=',' ',
    '>','>','>','>',' ','>','>',
    '<','<','<','<','<',' ','='
};//优先关系
char OP[OPSIZE] = { '+','-','*','/','(',')','#' };//运算符集合

typedef struct {
    int* base;//栈底指针
    int* top;//栈顶指针
    int stacksize;//栈最大容量
}SqStack;

Status InitStack(SqStack& S) {//初始化
    S.base = new SElemType[MAXSIZE];//分配最大容量为MAXSIZE的数组空间
    if (!S.base)
        exit(OVERFLOW);//存储空间分配失败
    S.top = S.base;
    S.stacksize = MAXSIZE;
    return OK;
}
Status Push(SqStack& S, SElemType e) {//入栈
    if (S.top - S.base == S.stacksize)
        return ERROR;//栈满
    *(S.top)++ = e;//元素e压入栈顶,栈顶指针加一
    return OK;
}
Status Pop(SqStack& S, SElemType& e) {//出栈
    if (S.top == S.base)
        return ERROR;//栈空
    e = *--S.top;//栈顶指针减一,将栈顶元素赋给e
    return OK;
}
SElemType GetTop(SqStack& S) {//返回S的栈顶元素
    if (S.top != S.base)//栈非空
        return *(S.top - 1);
}

Status In(char op, char Op[]) {//判断读入字符ch是否为运算符
    for (int i = 0; i < OPSIZE; i++) {
        if (op == Op[i])
            return OK;
        else
            return ERROR;
    }
}
int FindOp(char op, char Op[]) {//字符在优先关系表中的位置
    int x;
    for (int i = 0; i < OPSIZE; i++)
        if (op == Op[i])
            x = i;
    return x;
}
char Precede(char op1, char op2) {//判断运算符栈的栈顶元素与读入运算符之间的优先级关系的函数
    return Prior[FindOp(op1, OP)][FindOp(op2, OP)];
}
int Operate(int a, int theta, int b) {//进行二元运算函数
    switch (theta)
    {
    case '+':
        return a + b;
        break;
    case '-':
        return a - b;
        break;
    case '*':
        return a * b;
        break;
    case'/':
        return a / b;
        break;
    default:
        return ERROR;
    }
}
OperandType EvaluateExpression()
{//后缀表达式
    int ch;
    int x, a, b, theta;
    SqStack OPTR, OPND;//操作符栈、操作数栈
    InitStack(OPND);
    InitStack(OPTR);
    Push(OPTR, '#');
    ch = getchar();
    while (ch != '#' || GetTop(OPTR) != '#')
    {
        if (!In(ch, OP))//不是运算符则进入OPND栈
        {
            Push(OPND, ch - 48);
            ch = getchar();
        }
        else
            switch (Precede(GetTop(OPTR), ch))
            {
            case '<':
                Push(OPTR, ch);
                ch = getchar();
                break;
            case '>':
                Pop(OPTR, theta);
                Pop(OPND, b);
                Pop(OPTR, a);
                Push(OPND, Operate(a, theta, b));
                break;
            case '=':
                Pop(OPTR, x);
                ch = getchar();
                break;
            }
    }
    return GetTop(OPND);
}
void main()
{
    printf("要求以字符序列的形式从终端输入语法正确,不含变量的整数表达式(以#结束):\n");
    int e = EvaluateExpression();
    printf("%d\n", e);
}
  • 写回答

1条回答 默认 最新

  • CSDN专家-link 2021-12-26 19:06
    关注

    死循环了吧
    Status In(char op, char Op[]) {//判断读入字符ch是否为运算符
    for (int i = 0; i < OPSIZE; i++) {
    if (op == Op[i])
    return OK;
    else
    return ERROR;
    }
    }
    这里写错了啊,你这等于比较了第一个字符就肯定结束了,修改如下:

    Status In(char op, char Op[]) {//判断读入字符ch是否为运算符
        for (int i = 0; i < OPSIZE; i++) {
            if (op == Op[i])
                return OK;
        }
        return ERROR;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 1月3日
  • 已采纳回答 12月26日
  • 创建了问题 12月26日

悬赏问题

  • ¥30 win from 窗口最大最小化,控件放大缩小,闪烁问题
  • ¥20 易康econgnition精度验证
  • ¥15 msix packaging tool打包问题
  • ¥28 微信小程序开发页面布局没问题,真机调试的时候页面布局就乱了
  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致