爱学习520 发表于 2020-7-20 11:33:11

一个栈的简单问题,求大佬

本帖最后由 爱学习520 于 2020-7-20 15:32 编辑

为什么输出一直是这样子,如图:最后面一张

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct SNode{
        int data;
        struct SNode* next;
}*Stack;

//创建一个栈
Stack CreateStack(){
        Stack s=(Stack)malloc(sizeof(struct SNode));
        s->next=NULL;
        return s;
}

//判断栈是否为空
int IsEmpty(Stack s){
        return (s->next==NULL);
}

//进栈
void Push(Stack s,int data){
        Stack cur=(Stack)malloc(sizeof(struct SNode));
        cur->data=data;
        //栈顶指向当前进栈的结点
        cur->next=s;
        s=cur;       
}

//出栈
int Pop(Stack s){
        if(IsEmpty(s)){
                printf("栈为空,无法出栈!\n");
                return NULL;
        }
        //保存当前的栈空间
        Stack p=s;
        //保存当前栈元素
        int data=s->data;
        //栈顶指向出栈后的栈顶空间
        s=s->next;
        //释放出栈的元素空间
        free(p);
       
        return data;       
}

main(){
        Stack s=CreateStack();
       
       
        Push(s,5);
        Push(s,6);
        Push(s,7);
        Push(s,8);
        Push(s,9);
       
        printf("出栈元素:%d",Pop(s));
}

然后我现在找到问题了,是因为s一直都指向建立栈时的栈底,所以我用了二级指针,把s的地址传递过去,每次进栈出栈后就是当前栈的指向了,可是我觉得二级指针太麻烦了,谁能继续改进一下

修改后的代码
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct SNode{
        int data;
        struct SNode* next;
}*Stack;

//创建一个栈
Stack CreateStack(){
        Stack s=(Stack)malloc(sizeof(struct SNode));
        s->next=NULL;
        return s;
}

//判断栈是否为空
int IsEmpty(Stack s){
        return (s->next==NULL);
}

//进栈
void Push(Stack *s,int data){
        Stack cur=(Stack)malloc(sizeof(struct SNode));
        cur->data=data;
        //栈顶指向当前进栈的结点
        cur->next=*s;
        *s=cur;       

}

//出栈
int Pop(Stack* s){
        if(IsEmpty(*s)){
                printf("栈为空,无法出栈!\n");
                return NULL;
        }
        //保存当前的栈空间
        Stack p=*s;
        //保存当前栈元素
        int data=(*s)->data;
        //栈顶指向出栈后的栈顶空间
        *s=(*s)->next;
        //释放出栈的元素空间
        free(p);
       
        return data;       
}

main(){
       
        Stack s=CreateStack();
               
        Push(&s,5);
        Push(&s,6);
        Push(&s,7);
        Push(&s,8);
        Push(&s,9);
       
        printf("出栈元素:%d \n",Pop(&s));
        printf("出栈元素:%d \n",Pop(&s));
        printf("出栈元素:%d \n",Pop(&s));
        printf("出栈元素:%d \n",Pop(&s));
}

赚小钱 发表于 2020-7-20 22:15:37

让 Push 函数返回新的栈顶就可以了

Stack Push(Stack s,int data){
      Stack cur=(Stack)malloc(sizeof(struct SNode));
      cur->data=data;
      //栈顶指向当前进栈的结点
      cur->next=s;
      return cur;   
}

临时号 发表于 2020-7-22 18:18:48

我修改不了

DoerChan 发表于 2020-7-23 06:04:08

萌新我来混一个鱼币!
页: [1]
查看完整版本: 一个栈的简单问题,求大佬