牵风 发表于 2022-4-5 16:04:56

不知道哪里出了问题

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

特别说明:

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 MAXSIZE5 //顺序栈存储空间的初始分配量
typedef int Status;
typedef char SElemType;


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

Status InitStack(SqStack &s){
    s.base = new SElemType;//为顺序栈动态分配一个最大容量为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());
}

豆嘉木 发表于 2022-4-5 16:17:27

兄弟,可以上传代码的哦

牵风 发表于 2022-4-5 17:02:20

豆嘉木 发表于 2022-4-5 16:17
兄弟,可以上传代码的哦

代码不是发了吗
页: [1]
查看完整版本: 不知道哪里出了问题