不抬头的小猪 2018-11-10 08:10 采纳率: 50%
浏览 323
已采纳

栈的应用,表达式转换。输入结束后为什么输不出来栈里的元素

#include
using namespace std;
#define maxsize 20
typedef struct
{
char *base;
char *top;
int stacksize;
}SqStack;

bool InitStack(SqStack &S)
{
S.base = new char[maxsize];
if (!S.base) return false;
S.top = S.base;
S.stacksize = maxsize;
return true;
}

bool Push(SqStack &S, char e)
{
if (S.top - S.base == S.stacksize)
return false;
*S.top = e;
S.top++;
return true;
}

bool Pop(SqStack &S, char &e)
{
if (S.top == S.base)
return false;
--S.top;
e = *S.top;
return true;
}

char GetTop(SqStack S)
{
char e;
if (S.top == S.base)
return false;
e = *(S.top - 1);
return e;
}

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

bool StackEmpty(SqStack &S)
{
if (S.top == S.base)
return true;
else
return false;
}
int main()
{
SqStack S;
InitStack(S);

Push(S, '#');
int t;
char ch, k, m, n, p;
cin >> ch;

for (; ch != '\n';cin>>ch)
{
    if (ch >= '0'&&ch <= '9') { t = ch - '0'; cout << t << ' '; }
    else
    {
        switch (bijiao(GetTop(S), ch))
        {
        case '<':Push(S, ch); break;
        case '>':while (GetTop(S) != '#')
                {
                     if (GetTop(S) != '(')
                     {
                         Pop(S, m);
                         cout << m << ' ';
                     }
                     else Pop(S, n);
                } break;
        }
    }
}

while (!StackEmpty(S))
{
    if (GetTop(S) != '#')
    {
        Pop(S, p);
        cout << p;
    }
}
return 0;

}

  • 写回答

3条回答 默认 最新

  • Italink 2018-11-10 08:22
    关注

    cin>>ch;无法接受到\n,改为

    另外,栈用的也有问题,看注释

    #include<iostream>
    using namespace std;
    #define maxsize 20
    typedef struct
    {
        char *base;
        char *top;
        int stacksize;
    }SqStack;
    bool InitStack(SqStack &S)
    {
        S.base = new char[maxsize];
        if (!S.base) return false;
        S.top = S.base;
        S.stacksize = maxsize;
        return true;
    }
    bool Push(SqStack &S, char e)
    {
        if (S.top - S.base == S.stacksize)
            return false;
        S.top++;        //先移动栈顶指针,此时栈顶为空,把e的值栈顶
        *S.top = e;
        return true;
    }
    bool Pop(SqStack &S, char &e)
    {
        if (S.top == S.base)
            return false;
        e = *S.top;    //先把栈顶元素给e,然后栈顶减一
        --S.top;
        return true;
    }
    char GetTop(SqStack S)
    {
        char e;
        if (S.top == S.base)
            return false;
        e = *S.top;     //把栈顶元素直接给e
        return e;
    }
    char bijiao(char a, char b)
    {
        if (a == '#' || a == '(')
        {
            if (b == ')') return '=';
            return '<';
        }
        if (a == '+' || a == '-')
        {
            if (b == '*' || b == '/' || b == '(')
                return '<';
            else return '>';
        }
        if (a == '*' || a == '/')
        {
            if (b == '(')
                return '<';
            else return '>';
        }
        if (a == ')')
            return '<';
    }
    bool StackEmpty(SqStack &S)
    {
        if (S.top == S.base)
            return true;
        else
            return false;
    }
    int main()
    {
        SqStack S;
        InitStack(S);
        Push(S, '#');
        int t;
        char ch, k, m, n, p;
        ch=getchar();       //cin>>不能接受到\n,改用getchar
        for (; ch != '\n'; ch=getchar()) //同上
        {
            if (ch >= '0'&&ch <= '9') {
                t = ch - '0'; 
                cout << t << ' ';
            }
            else
            {
                switch (bijiao(GetTop(S), ch))
                {
                case '<':Push(S, ch); break;
                case '>':while (GetTop(S) != '#')
                {
                    if (GetTop(S) != '(')
                    {
                        Pop(S, m);
                        cout << m << ' ';
                    }
                    else Pop(S, n);
                } break;
                }
            }
        }
    
        while (!StackEmpty(S))
        {
            if (GetTop(S) != '#')
            {
                Pop(S, p);
                cout << p;
            }
            else                //如果得到#,可以弹出#,然后才能确保栈空,结束循环
                Pop(S, p);
        }
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 powerbuilder中的datawindow数据整合到新的DataWindow
  • ¥20 有人知道这种图怎么画吗?
  • ¥15 pyqt6如何引用qrc文件加载里面的的资源
  • ¥15 安卓JNI项目使用lua上的问题
  • ¥20 RL+GNN解决人员排班问题时梯度消失
  • ¥60 要数控稳压电源测试数据
  • ¥15 能帮我写下这个编程吗
  • ¥15 ikuai客户端l2tp协议链接报终止15信号和无法将p.p.p6转换为我的l2tp线路
  • ¥15 phython读取excel表格报错 ^7个 SyntaxError: invalid syntax 语句报错
  • ¥20 @microsoft/fetch-event-source 流式响应问题