数据结构--对栈的操作

在这里插入图片描述

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

typedef struct Node
{
    int data;
    struct Node * pNext;
}NODE,* PNODE;

typedef struct Stack
{
	PNODE pTop; //指向栈第一个元素,存放栈元素地址,所以数据类型是struct Node类型
	PNODE pBottom;
}STACK, * PSTACK;  //PSTACK 等价于 struct STACK *

void init(PSTACK);//初始化一个栈
void push(PSTACK, int );//入栈
void traverse(PSTACK);//遍历
bool pop(PSTACK, int *);//出栈,先进后出
void clear(PSTACK pS);//清空栈

int main(void)
{
    STACK S;  //STACK 等价于 struct Stack
    int val; //出栈传出的值
    init(&S);
    push(&S, 7 );
    push(&S, 9 );
    push(&S, 8 );
    push(&S,8);
    traverse(&S);
    pop(&S, &val);
    traverse(&S);
    clear(&S);
    traverse(&S);
    push(&S, 9 );
    push(&S, 8 );
    traverse(&S);
    pop(&S, &val);
    traverse(&S);    
    return 0;
}

void init(PSTACK pS)
{
	pS->pTop = (PNODE)malloc(sizeof(NODE));//不放值,在栈底,pS->pBottom->pNext = NULL
	if (NULL == pS->pTop)
	{
		printf("动态内存分配失败!\n");
		exit(-1);
	}
	else
	{
		pS->pBottom = pS->pTop;
		pS->pTop->pNext = NULL; //pS->Bottom->pNext = NULL;
	}
}

void push(PSTACK pS, int val)
{
    PNODE pNew = (PNODE)malloc(sizeof(NODE));
    if (NULL == pNew)
	{
		printf("动态内存分配失败!\n");
		exit(-1);
	}
	else
	{
		pNew->data = val;
        pNew->pNext = pS->pTop;
        pS->pTop = pNew;
        return;
	}

}

void traverse(PSTACK pS)
{
    PNODE p = pS->pTop;//PSTACK p = pS也正确,数据类型要一致
    while (pS->pBottom != p)//NULL != p不能用这个做判断,栈底元素p->pNext(等于p->pNext)也是为真,p->pNext->data是垃圾值
    {
        printf("%d  ",p->data);
        p = p->pNext;//p->pNext存放的是栈元素下一个地址
    }
    printf("\n");

	return;
    
}

bool pop(PSTACK pS,int *val)
{
    if (pS->pBottom == pS->pTop)
    {
       printf("栈为空!!!\n");
       return false;
    }
    else
    {
        PNODE p = pS->pTop;
        *val = p->data;
        pS->pTop = p->pNext;
        free(p);//释放p地址所指向的空间
        //printf("%d",p);
        p = NULL;
        return true;
    }
    
}

void clear(PSTACK pS)
{
    if (pS->pBottom == pS->pTop)
    {
       return;
    }
    else
    {
        PNODE p = pS->pTop;
		PNODE q = NULL;
        while (p != pS->pBottom)
        {
            q = p->pNext;//必须提前赋值
            free(p);//
            p = q;//p=p->pNext是错的,下一次free时出错,我认为是p地址所指向的空间p->data,p->pNext已经释放了
        }
        pS->pTop = pS->pBottom;

    }
    
    
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值