m0_64857843 2022-11-28 14:30 采纳率: 85.7%
浏览 17
已结题

关于c语言顺序栈的进栈出栈展示问题,为什么没有报错了还是运行情况不对

img

img

img

img

img


C语言顺序栈问题,关于进栈出打印展示的函数使用,已经修改到没有错误了,为什么功能还是实现起来有问题

  • 写回答

3条回答 默认 最新

  • 关注

    有几个错误:
    (1)stacktop函数不是所有的分支都有返回值,最好用返回值来判断是否获取成功,通过参数来获取栈顶元素。
    (2)Print函数中,i应该从t->top开始,并且 if(t->top != -1)应该是 if (t->top == -1)
    (3)main函数中,stacktype* t这一句,t是野指针,没有初始化,initiatest(&t)是错误的。
    修改后的运行结果:

    img

    代码:

    #include <stdio.h>
    #include <stdlib.h>
    #define NULL 0
    #define true 1
    #define MAXNUM 20
    #include <string.h>
    #define OK 1
    typedef struct
    {
        int stack[MAXNUM];
        int top;
    }stacktype;
    
    stacktype s;
    
    int initiatest(stacktype* t)
    {
        t->top = -1;
        return OK;
    }
    int stackfull(stacktype* t)
    {
        return (t->top == MAXNUM - 1);
    }
    int stackempty(stacktype* t)
    {
        return (t->top == -1);
    }
    
    int pushs(stacktype* t, int x)
    {
        if (t->top == MAXNUM - 1)
            return NULL;
        else
        {
            t->top++;
            t->stack[t->top] = x;
            return true;
        }
    }
    
    int pops(stacktype* t)
    {
        if (t->top < 0)
            return NULL;
        else
        {
            t->top--;
            return t->stack[t->top + 1];
        }
    }
    
    int stacktop(stacktype* t)
    {
        if (stackempty(t))
        {
            printf("stack is empty\n");
            return NULL;
        }
        else
        {
            return t->stack[t->top];
        }
    }
    
    int Print(stacktype* t)
    {
        if (t->top == -1) //修改,这里是==
            return NULL;
        else
        {
            for (int i = t->top; -1 < i; i--)
                printf("%d ", t->stack[i]);
            printf("\n");
            return true;
        }
    }
    
    int main()
    {
        stacktype list;
        stacktype* t = &list;  //修改,这里给t初始化
        int x;
        int n; 
        if (initiatest(t))
            printf("初始化成功\n");
        while (1)
        {
            printf("请输入要进行的操作:\n");
            printf("1.进栈\n2.出栈\n3.获取栈顶元素\n4.打印\n0.退出\n");
            scanf("%d", &x);
            if (x == 0)
                break;
            switch (x)
            {
            case 1:
                printf("请输入要进栈的元素:");
                //int n;  //不要再switch中声明变量,部分编译器中不允许
                scanf("%d", &n);
                if (pushs(t, n))
                    printf("进栈成功\n");
                else
                    printf("进栈失败\n");
                break;
            case 2:
                if (!stackempty(t))
                {
                    n = pops(t);
                    printf("元素%d出栈\n", n);
                }
                else
                    printf("出栈失败\n");
                break;
            case 3:
                if (!stackempty(t))
                {
                    n = stacktop(t);
                    printf("栈顶元素是:%d\n", n);
                }
                else
                    printf("获得栈顶元素失败\n");
                break;
            case 4:
                if (Print(t))
                    printf("打印完毕\n");
                break;
            default:
                printf("您进行了误操作,请重试!\n");
                break;
            }
        }
        return 1;
    }
    
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 12月6日
  • 已采纳回答 11月28日
  • 创建了问题 11月28日

悬赏问题

  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助
  • ¥15 STM32控制MAX7219问题求解答