郝斌数据结构学习记录(三)——栈的笔记及部分算法的c语言实现

依然范特西╮ 提交于 2020-01-31 03:13:44

线性结构的常见应用:栈
定义:一种可以实现“先进后出”的存储结构。
分类:静态栈,动态栈
算法:出栈,压栈
应用:函数调用,中断,表达式求值,内存分配,缓冲处理,迷宫

VS2017中 c语言实现动态栈的初始化,入栈,出栈,遍历输出,判断是否为空,清空

#include<stdio.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 is_empty(PSTACK);
bool pop(PSTACK, int *);
void clear(PSTACK);

int main() {
	STACK S;//现有空间,内有pTop,pBottom指向一个垃圾值
	int val;

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

	clear(&S);
	traverse(&S);

	system("pause");
	return 0;
}

//让pTop,pBottom指向头结点完成初始化,头结点只是方便操作,并不一定是要在首结点的前面
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;//指针域清零
	}
}

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

//FILO
void traverse(PSTACK ps){
	PNODE p = ps->pTop;

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

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

//可能pop失败故用bool类型,且要将出栈的元素存入pVal形参中,故用指针
bool pop(PSTACK ps, int * pVal){
	if (is_empty(ps))
		return false;
	else {
		PNODE r = ps->pTop;
		ps->pTop = r->pNext;
		* pVal = r->data;
		free(r);
		r = NULL;
		return true;
	}
}

//这里是让top往下移
void clear(PSTACK ps) {
	if (is_empty(ps))
		return;
	else {
		PNODE p = ps->pTop;

		while (p != ps->pBottom) {
			ps->pTop = p->pNext;
			free(p);
			p = ps->pTop;
		}
	}
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!