郝斌_数据结构_栈源代码

郝斌《数据结构》课程源代码

栈的实现

用者自取,自由分享

/*
 * 时间:2021.01.14
 * 内容:栈程序演示
 */

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

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

typedef struct Stack
{
		PNODE pTop;
		PNODE pBottom;
}STACK, * PSTACK;

void init(PSTACK);
void push(PSTACK, int);
void traverse(PSTACK);
bool pop(PSTACK, int *);
bool empty(PSTACK);
void clear(PSTACK);


int main(Stackvoid)
{
		STACK S;
		int val;

		init(&S);
		push(&S, 1);
		push(&S, 2);
		push(&S, 3);
		push(&S, 4);
		push(&S, 5);
		push(&S, 6);

		traverse(&S);
		
		if( pop(&S, &val) )
		{
				printf("出栈成功,出栈的元素是%d\n", val);
		}
		else
		{
				printf("出栈失败\n");
		}

		traverse(&S);

		clear(&S);

		traverse(&S);
				
		return 0;
}

void init(PSTACK pS)
{
		pS->pTop = (PNODE)malloc(sizeof(NODE));
		if(NULL == pS->pTop)
		{
				printf("动态内存分配失败\n");
				exit(-1);
		}
		else
		{
				pS->pBottom = pS->pTop;
				pS->pTop->pNext = NULL;
		}
			
		return;
}

void push(PSTACK pS, int val)
{
		PNPDE pNew = (PNODE)malloc(sizeof(NODE));
		pNew->data = val;
		pNew->pNext = pS->pTop;
		pS->pTop = pNew;

		return;
}

void traverse(PSTACK pS)
{
		PNODE p = pS->Top;

		while(p != pS->pBottom)
		{
				prinyf("%d ", p->data);
				p = p->pNext;
		}
		
		printf("\n");

		return;
}

//把pS所指向的栈出栈一次,并把出栈的元素存入pVal形参所指向的变量中,如果出栈失败,返回false,否则返回true
bool pop(PSTACK pS, int * pVal)
{
		if( empty(pS) )
		{
				return false;
		}
		else
		{
				PNODE r = pS->pTop;
				*pVal = r->data;
				pS->pTop = r->pNext;
				free(r);
				r = NULL;

				return true;
		}
}

bool empty(PSTACK pS)
{
		if(pS->pTop == pS->pBottom)
		{
				return true;
		}
		else
		{
				return false;
		}
}

void clear(PSTACK pS)
{
		if( empty(pS) )
		{
				return;
		}
		else
		{
				PNODE p = pS->pTop;
				PNODE q = NULL;

				while(p != pS->pBottom)
				{
						q = p->pNext;
						free(p);
						p = q;
				}
				
				pS->pTop = pS->pBottom;
		}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值