鱼C论坛

 找回密码
 立即注册
查看: 1274|回复: 2

不知道哪里出了问题

[复制链接]
发表于 2022-4-5 16:04:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
对简单的算术表达式求值。运算符包括+,-,*,/,(,),#。参加运算的数均为整数。

特别说明:

1)实验课请按照数据结构(C语言版)p53页算法3.4直接进行改编。算法的要求与编程实现尽量与教材上的算法基本一致。

2)要实现算法3.4,还需要编写的函数如下:初始化栈函数--InitStack()函数,入栈函数--Push()函数,取栈顶元素函数--GetTop()函数,运算符判断函数--In()函数,运算符优先级判断函数--Precede()函数,出栈函数--Pop()函数,运算操作函数--Operate()函数。

输入
输入一个简单的算术表达式,并以“#”号结束,如输入表达式:3*(7-2)#

考虑一行输入数据即可,不必考虑多行输入。

输出
输出表达式对应的运算结果。如上面输入表达式的运算结果为:15

样例输入 Copy
3*(7-2)#
样例输出 Copy
15

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW - 2
#define MAXSIZE  5 //顺序栈存储空间的初始分配量
typedef int Status;
typedef char SElemType;


typedef struct{
    SElemType *base;
    SElemType *top;
    int stacksize;
}SqStack;

Status InitStack(SqStack &s){
    s.base = new SElemType[MAXSIZE];//为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
   if(!s.base)
      exit(OVERFLOW); //存储分配失败
   s.top = s.base; //top初始为base,空栈
   s.stacksize = MAXSIZE; //stacksize置为栈的最大容量MAXSIZE
   return OK;
}//InitStack

Status Push(SqStack &s, SElemType e){
   if(s.top-s.base==s.stacksize)return ERROR;
   *s.top++=e;
   return OK;
}//Push

Status Pop(SqStack &s, SElemType &e){
    if(s.base == s.top) return ERROR;
    e = *--s.top;
    return OK;
}//Pop

SElemType GetTop(SqStack s){
    if(s.base == s.top) return ERROR;
    return *--s.top;
}//GetTop

Status In(SElemType c){
    if(c=='+'||c=='-'||c=='*'||c=='/'||c=='#'||c=='('||c==')'||c=='['||c==']')
        return OK;
    else
        return ERROR;
}//In

char Precede(SElemType a, SElemType b){
    if(a=='+'||a=='-'){
        if(b=='+'||b=='-'||b==')'||b==']')
            return '>';
        else return '<';
    }
    if(a=='*'||a=='/'){
        if(b=='('||b=='[')
            return '<';
        else return '>';
    }
    if(a=='('){
        if(b==')')
            return '=';
        else return '<';
    }
    if(a=='['){
        if(b==']')
            return '=';
        else return '<';
    }
    if(a=='#'){
        if(b=='#')
            return '=';
        else return '<';
    }
}//Precede

SElemType Operate(SElemType a, SElemType x, SElemType b){
    switch (x){
    case '+':
        return a  + b;
    case '-':
        return a  - b;
    case '*':
        return a * b;
    case '/':
        return a / b;
    }
}//Operator
char EvaluateExpression(){
    SqStack OPTR, OPND;
    InitStack(OPTR);
    InitStack(OPND); //操作符
    Push(OPTR, '#');//操作数
    char ch,x,theta;
    cin>>ch;
    while(ch != '#' || GetTop(OPTR)!='#'){
        if(!In(ch))
        {
           Push(OPND,ch);
           cin>>ch;
        }
        else
            switch(Precede(GetTop(OPTR), ch))
            {
            case '<':
                Push(OPTR,ch);cin>>ch;
                break;
            case '>':
                Pop(OPTR,theta);
                SElemType a, b;
                Pop(OPND, b); Pop(OPND, a);
                Push(OPND, Operate(a, theta, b));
                break;
            case '=':
                Pop(OPTR, x);
                cin>>ch;
                break;
            }
    }
    return GetTop(OPND);
}//EvaluateExpression
int main()
{
    SqStack S;
    InitStack(S);
    printf("%c",EvaluateExpression());
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-5 16:17:27 | 显示全部楼层

回帖奖励 +9 鱼币

兄弟,可以上传代码的哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-5 17:02:20 | 显示全部楼层
豆嘉木 发表于 2022-4-5 16:17
兄弟,可以上传代码的哦

代码不是发了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 00:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表