xiaohuanghuang_
xiaohuanghuang_
采纳率80.8%
2021-03-16 11:58 阅读 45

为什么pop没有让链栈出栈,我有ls->top=(ls->top)->next; 呀???

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
typedef int T; //数据元素类型
struct LNode {
    T data;
    LNode* next;
};

struct LinkStack {
    LNode* top; // 栈顶指针
    int len; // 栈的长度
};
LinkStack* LS_Create()
{
    LinkStack* ls=(LinkStack*)malloc(sizeof(LinkStack));
    ls->top = NULL;
    ls->len = 0;
    return ls;
}

/*释放栈*/
void LS_Free(LinkStack* ls)
{
    LNode* curr = ls->top;
    while(curr) {
        LNode* next = curr->next;
        free(curr);
        curr=next;
    }
    free(ls);
}

/*将栈变为空栈*/
void LS_MakeEmpty(LinkStack* ls)
{
    LNode* curr = ls->top;
    while(curr) {
        LNode* next = curr->next;
        free(curr);
        curr=next;
    }
    ls->top = NULL;
    ls->len = 0;
}

/*判断栈是否为空*/
bool LS_IsEmpty(LinkStack* ls)
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    return ls->len;

    /********** End **********/
}

/*获取栈的长度*/
int LS_Length(LinkStack* ls)
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    return ls->len-1;

    /********** End **********/
}

/*将x进栈*/
void LS_Push(LinkStack* ls, T x)
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    LNode *s=(LNode*)malloc(sizeof(LNode));
    s->data=x;
    s->next=ls->top;
    ls->top=s;
    ls->len++;

    /********** End **********/
}

/*出栈。出栈元素放入item;如果空栈,将返回false*/
bool LS_Pop(LinkStack* ls, T& item)
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    if(LS_IsEmpty(ls))
    return false;
    item=ls->top->data;    
    ls->top=(ls->top)->next;        //就是这里,我明明让top指向下一个LNode呀
    ls->len--;
    return true;
    /********** End **********/
}

/*读栈顶元素放入item。如果空栈,将返回false*/
bool LS_Top(LinkStack* ls, T& item)
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
if(LS_IsEmpty(ls))
    return false;
    item=ls->top->data;
    return true;
    /********** End **********/
}

/*从栈顶到栈底打印各结点数据*/
void LS_Print(LinkStack* ls)
{
    if (ls->len==0){ 
        printf("The stack: Empty!");
        return;
    }
    printf("The stack (from top to bottom):");
    LNode* curr=ls->top;
    while(curr) {
        printf(" %d", curr->data);
         
        curr=curr->next;
    }
   // printf("\n");
}

int main()
{
    LinkStack* ls=LS_Create();
    char dowhat[100];
    while(true) {
        scanf("%s", dowhat);
        if (!strcmp(dowhat,"push")) {
            T x;
            scanf("%d", &x);
            LS_Push(ls,x);
        }else if (!strcmp(dowhat,"pop")) {
            T item;
            LS_Pop(ls, item);
		}
        else {
            break;
        }
    }
    int length=LS_Length(ls);
    printf("Stack length: %d\n", length);
	
    LS_Print(ls);getch();
    LS_Free(ls);
}

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

1条回答 默认 最新

  • 已采纳
    weixin_41830716 规则边缘 2021-03-16 12:43

    你的isEmpty实现不对, 可以return ls->len == 0;

    点赞 1 评论 复制链接分享

相关推荐