C语言--栈的实现

image

image

image

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

typedef struct Node    // 定义一个结构体,包含数据和指向下一个节点的指针
{
	int data;
	struct Node * p_next; //指向下一个节点的指针  类型也是struct Node *
} NODE, *PNODE;

/*
	定义一个栈,包含栈顶和栈底节点
*/

typedef struct Stack
{
	PNODE p_top;
	PNODE p_bottom;
} STACK, *PSTACK;

void init_stack(PSTACK);

void push_stack(PSTACK p_stack, int value);

void traverse_stack(PSTACK p_stack);

bool is_empty(PSTACK p_stack);

bool pop_stack(PSTACK p_stack, int *value);

void clear_stack(PSTACK p_stack);

int main()
{
	STACK S; //定义一个栈 此时 p_top 和 p_bottom 是无效数据,必须初始化
	int value;

	init_stack(&S);

	push_stack(&S, 1);

	push_stack(&S, 2);

	push_stack(&S, 3);

	traverse_stack(&S);

	clear_stack(&S);

	if (pop_stack(&S, &value))
	{
		printf("pop successfully, the element is %d\n", value);
	}
	else
	{
		printf("pop failed\n");
	}

	traverse_stack(&S);
}

/*
	初始化一个stack
*/

void init_stack(PSTACK p_stack)
{
	p_stack->p_top = (PNODE)malloc(sizeof(NODE)); //为栈顶分配内存
	if (p_stack->p_top == NULL)  /*
									如果为空返回失败
								 */
	{
		printf("dynamic memory malloc failed\n");
		exit(-1);
	}
	else
	{
		/*
			栈顶节点等于栈底节点
			栈顶节点的下一个节点指向为空,需要指向新添加的节点的地址
		*/
		p_stack->p_bottom = p_stack->p_top;
		p_stack->p_top->p_next = NULL;
	}
}

/*
	压栈
*/

void push_stack(PSTACK p_stack, int value)
{
	PNODE p_new = (PNODE)malloc(sizeof(NODE)); //新申请一块空间给新的节点
	p_new->data = value;				       //新节点的值为value		
	p_new->p_next = p_stack->p_top;            //新节点的指针域指向栈顶节点 
	p_stack->p_top = p_new;                    //栈顶节点指向新节点 把新节点的地址发送给p_top

	return;
}

/*
	遍历栈中元素
*/

void traverse_stack(PSTACK p_stack)
{
	PNODE p = p_stack->p_top;

	while (p!= p_stack->p_bottom)
	{
		printf("%d ", p->data);
		p = p->p_next;
	}
	printf("\n");
}

/*
	出栈
*/

bool pop_stack(PSTACK p_stack, int *value)
{
	if (is_empty(p_stack)) //判断栈是否为空
	{
		return false;
	}
	else
	{
		/*
			思路:
				1.先将栈顶节点的值保存起来
				2.栈顶节点的指向下一个节点
				3.释放上一个地址的内存
		*/
		PNODE r = p_stack->p_top; //定义一个节点r,指向p_top 
		*value = r->data;	//r的值存入value
		p_stack->p_top = r->p_next; //栈顶指向r->p_next
		free(r); //删除元素
		r = NULL;
		return true;
	}
}

/*
	判断栈是否为空
*/

bool is_empty(PSTACK p_stack)
{
	if (p_stack->p_top == p_stack->p_bottom) //如果二者相等,则栈为空
	{
		return true;
	}
	else
	{
		return false;
	}
}

/*
	清空栈
*/
void clear_stack(PSTACK p_stack)
{
	if (is_empty(p_stack))
	{
		return;
	}
	else
	{
		PNODE p = p_stack->p_top; //定义指针p指向栈顶节点
		PNODE q = NULL;	//定义指针q
		/*
			当指针p不等于栈底节点时,释放内存
			只要p指向的还有下一个元素,q就指向下一个元素,删除p,p指向下一个元素
		*/
			while (p != p_stack->p_bottom)
			{
				q = p->p_next;
				free(p);
				p = q;
			}
		p_stack->p_top = p_stack->p_bottom;
	}
}

以上。

猜你喜欢

转载自www.cnblogs.com/ykyk1229/p/9804382.html