【数据结构】C语言最基础练习:栈的初始化,压栈,出栈,遍历,清空

随手练习一下,详细代码解释都在代码片里请仔细看看
如果有什么不对的地方,请在下方留言
先建立头文件:

#define _CRT_SECURE_NO_WARNINGS 1
#ifndef _TEST_H
#define _TEST_H
//栈的链式存储结构;
typedef struct Node  //创建一种类型的节点;
{
	int data;
	struct Node * pnext;
}NODE, *PNODE;
typedef struct Stack  //创建一个栈类型,里面含有两个指针,一个指向栈顶,一个指向栈底
{
	PNODE ptop;
	PNODE pBottom;
}STACK, *PSTACK;

void init(PSTACK ps);//初始化栈
void push(PSTACK ps, int val);//压栈
void traverse(PSTACK ps);//遍历栈
bool empty(PSTACK ps);//判断栈是否为空
bool pop(PSTACK ps, int * pval);//出栈
void clear(PSTACK ps);//清空栈
#endif  //_TEST_H
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <stdbool.h>
#include "test.h"
int main()
{
	//int val;//保存出栈的元素
	STACK S;//定义一个栈变量
	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);
		printf("-------------------------------------------------------\n");
	}
	else
	{
		printf("出栈失败!\n");
	}*/
	//traverse(&S);
	clear(&S);//清空
	printf("-------------------------------------------------------\n");
	printf("清空后栈中元素为:");
	printf("栈中元素为:\n");
	traverse(&S);
	//free(S);//销毁栈
	system("pause");
	return 0;
}
void init(PSTACK ps)
{
	ps->ptop = (PNODE)malloc(sizeof(NODE));//创建一个空栈
	if (NULL == ps->ptop)
	{
		printf("success\n");
		exit(-1);
	}
	else
	{
		ps->pBottom = ps->ptop;//栈底指针跟栈顶指针都指向这个新建的空节点
		ps->ptop->pnext = NULL;
	}
}
void push(PSTACK ps, int val)//压栈
{
	PNODE pNew = (PNODE)malloc(sizeof(NODE));//新建一个节点
	pNew->data = val;//新节点数据域等于val
	pNew->pnext = ps->ptop;//新节点指针域指向栈顶指针所指向的节点,就是前面栈底跟栈顶同时指向的空节点,这样就实现压栈了
	ps->ptop = pNew;//然后栈顶元素上移,始终指向就是最后入栈的节点
}
void traverse(PSTACK ps)//遍历
{
	PNODE p = ps->ptop;//遍历是从栈顶依次输出,所以创建一个指针,指向栈顶指针所指向的节点
	while (p!=ps->pBottom)//当p所指向的节点不是栈底指针指向的节点时
	{
		printf("%d\n", p->data);//输出p所指向的节点的数据域的值
		p = p->pnext;//然后指针p重新指向下一个节点
	}
}
//bool pop(PSTACK ps, int * pval)//出栈一个元素
//{
//	if (empty(ps))//先判断栈是否为空
//	{
//		return false;
//	}
//	else//不为空时
//	{
//		PNODE r = ps->ptop;//创建一个新的指针r,指向栈顶指针所指向的节点
//		*pval = r->data;//将该节点的数据域赋值给val
//		ps->ptop = r->pnext;//栈顶指针重新指向r所指向的下一个节点,
//		free(r);//释放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)//当p所指向的节点不是栈底指针所指向的节点时
		{
			q = p->pnext;//先将p所指向的下一个节点赋给q
			free(p);//然后删除该节点
			p = q;//然后将q指向的节点赋给p,也就是p重新指向了p的下一个节点
		}
		ps->ptop = ps->pBottom;//循环完了之后,栈底指针跟栈底指针指向同一个节点
	}
}

猜你喜欢

转载自blog.csdn.net/baidu_39334407/article/details/83447886