不要停止脚步! 2020-11-04 16:32 采纳率: 0%
浏览 28

C++,使用栈求表达式的值,请问代码哪里出错了?

include<iostream>
#include <stdio.h>
#include <string.h>
#define  MAXSIZE  100
using namespace std;
typedef char SElemType;
typedef struct
{
        SElemType   *base;  //栈底指针
        SElemType   *top;   //栈顶指针
        int stacksize;      //栈可用最大容量
}SqStack;
int InitStack( SqStack &s ) //初始化
{
    s.base=new SElemType[MAXSIZE];
    if(!s.base) return 0 ;
    s.top=s.base;
    s.stacksize=MAXSIZE;
    return 1;
}
int StackEmpty( SqStack s ) //判断栈是否为空
{
    if(s.base=s.top) return 1;
    else return 0;
}
int StackLength( SqStack s )//求栈长度
{
    return s.top-s.base;
}
int Push( SqStack &s, SElemType e)   //进栈
{
    if(s.top-s.base==s.stacksize) return 0;
    *s.top++=e;
    return 1;
}
int Pop( SqStack &s, SElemType &e)   //出栈
{
    if(s.top==s.base) return 0;
    e=*--s.top;
    return 1;
}
SElemType GetTop(SqStack s)    //取栈顶元素 
{    SElemType e;
    if(s.top==s.base) return '0';
    e=*(s.top-1);
    return e;
}
int In(SElemType ch)  //判断输入的是符号还是数字 
{    
    if (ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'=='#')
    return 1;
    else return 0;

SElemType Precede(char n,char ch)    //比较优先级  
{     char f;
    switch(n)
    {
        case'+':
            if(ch=='+'||ch=='-'||ch==')'||ch=='#')
            f='>';
            else f='<';
            break;
        case'-':
            if(ch=='+'||ch=='-'||ch==')'||ch=='#')
            f='>';
            else f='<';
            break;
        case'*':
            if(ch==')')
            f='<';
            else f='>';
            break;
        case'/':
            if(ch==')')
            f='<';
            else f='>';    
            break;
        case'(':
            if(ch==')')
            f='=';
            else f='<';
            break;
        case')':
            f='>';
            break;
        case'#':
            if(ch=='#')
            f='=';
            else f='<';
            break;
            
    }
    return f;    
}

SElemType Operate(char a,char theta,char b)     
{    char c;
    a=a-48;
    b=b-48;
    switch(theta)
    {    
        switch(theta)
        {
        case'+':
            c=a+b+48;
            break;
        case'-':
            c=(a-b)+48;
            break;
        case'*':
            c=(a*b)+48;
            break;
        case'/':
            c=(a/b)+48;
            break;
        }            
    }
    return c;
}
SElemType Ev()
{    SqStack OPND;
    SqStack OPTR;
    char ch,a,b,theta;
    
    InitStack(OPND);    //存放数字 
    InitStack(OPTR);    //存放符号 
    Push(OPTR,'#');        //起始符 
    cin>>ch;
    while(ch!='#'||GetTop(OPTR)!='#')        //终止输入标志#  取栈顶元素判断是否为# 
    {    char x;
        if(!In(ch))        //如果输入的不是运算符,存入OPND栈 
        {
            Push(OPND,ch);
            cin>>ch;
        }
        else
            switch(Precede(GetTop(OPTR),ch))    //如果是运算符,比较优先级 
            {
                case'<':
                    Push(OPTR,ch);            //栈顶优先级小,将当前字符压入OPTR栈,继续读下一字符 
                    cin>>ch;
                    break;
                case'>':        //优先级大,弹出OPTR栈顶运算符和OPND栈顶运算数 
                    Pop(OPTR,theta);
                    Pop(OPND,b);Pop(OPND,b);
                    Push(OPND,Operate(a,theta,b));    //进行运算后压入OPND栈 
                    break;
                case'=':
                    Pop(OPTR,x);cin>>ch;        //优先级相等,即栈顶为"( "输入ch为 ") ",则弹出栈顶的左括号,读下一字符 
                    break;
                
            }
    }
    return GetTop(OPND);        //OPND栈顶元素即表达式的求值结果 
}


int main()
    {
    cout<<"请输入算术表达式,以#结束"<<endl;
    cout<<Ev()<<endl; 
}

  • 写回答

1条回答 默认 最新

  • 芒种、 2020-11-05 10:36
    关注

    这么长的代码,谁有时间帮你看哦。。。。。

    评论

报告相同问题?

悬赏问题

  • ¥15 求caverdock使用教程
  • ¥15 Coze智能助手搭建过程中的问题请教
  • ¥15 12864只亮屏 不显示汉字
  • ¥20 三极管1000倍放大电路
  • ¥15 vscode报错如何解决
  • ¥15 前端vue CryptoJS Aes CBC加密后端java解密
  • ¥15 python随机森林对两个excel表格读取,shap报错
  • ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
  • ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。
  • ¥30 求给定范围的全体素数p的(p-2)/p的连乘积值