C实现中缀表达式转换为后缀表达式,运行之后出现停止工作的框

发布于 2022-09-06 20:50:10 字数 2499 浏览 10 评论 0

我在看一个视频学习数据结构,然后构建栈的函数是我自己写的,我觉得应该没有写错。实现中缀转后缀是看视频学的。我感觉代码好像没啥问题,每次build的时候也不会报错,但一旦run就会出现图中的问题,结果是跑出来了,也是对的,但就是出现这样的问题?求解各位大神!谢谢!图片描述

我的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef struct SingleList
{
    char data;
    struct SingleList *next;
}LIST, *LPLIST;

LPLIST CreateNode(char data)
{
    LPLIST newNode = (LPLIST)malloc(sizeof(LIST));
    newNode->data = data;
    newNode->next = NULL;
}

typedef struct ListStack
{
    LPLIST top;
    int size;
}STACK, *LPSTACK;

LPSTACK CreateStack()
{
    LPSTACK S = (LPSTACK)malloc(sizeof(STACK));
    S->top = NULL;
    S->size = 0;
    return S;
}

int IsEmptyStack(LPSTACK S)
{
    if(S->size==0)
        return 1;
    else
        return 0;
}

void Push(LPSTACK S, char data)
{
    LPLIST newNode = CreateNode(data);
    newNode->next = S->top;  //先连接
    S->top = newNode;  //后断开
    S->size++;
}

char Pop(LPSTACK S)
{
    char c;
    if(IsEmptyStack(S))
    {
        printf("栈已空,无法出栈\n");
        return;
    }
    c= S->top->data;
    LPLIST node = S->top->next;
    free(S->top);
    S->top = node;
    S->size--;
    return c;
}


int main()
{
    char c,e;
    LPSTACK S = CreateStack();
    printf("请输入中缀表达式:");
    c = getchar();

    while(c!='\n')
    {
        if(c>='0' && c<='9')
            printf("%c\t",c);
        else if(')' == c)
        {
            e = Pop(S);
            while( '(' != e)
            {
                printf("%c\t",e);
                e = Pop(S);
            }
        }
        else if('+' == c || '-'== c )  //这表明栈顶符号比c高级,所以应该将栈顶符号一直弹出,直到可以压栈为止
        {
            if(IsEmptyStack(S))
                Push(S,c);
            else
            {
                do
                {
                    e = Pop(S);
                    if ('(' == e)
                        Push(S,e);
                    else
                        printf("%c\t",e);
                }while(!IsEmptyStack(S) && '(' != e);
                Push(S,c);
            }
        }
        else if('*' == c || '/'== c || '(' == c)
            Push(S,c);
        else
        {
            printf("\n输入格式错误");
            return -1;
        }
        c = getchar();
    }
    while(S->top->data != '#')
        printf("%c\t",Pop(S));
    return 0;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文