线性结构_栈

线性结构的应用--栈
定义:一种可以实现先进后出的存取结构。类似于箱子,往箱子里面放书,后放的在顶部,可以先拿出来。
分类:
静态栈:以数组为内核
动态栈:以链表为内核
应用:函数调用,中断,表达式求值,内存分配,缓冲处理,走迷宫
#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 initStack(PSTACK);

void pushStack(PSTACK, int);

bool popStack(PSTACK , int *);

void clear(PSTACK);

void traverseStack(PSTACK);

int main() {
	STACK S;
	int val;			//保存出栈元素

	initStack(&S);		//造出一个空栈

	pushStack(&S, 1);	//压栈

	pushStack(&S, 2);

	pushStack(&S, 3);

	pushStack(&S, 4);

	pushStack(&S, 5);

	traverseStack(&S);

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

	clear(&S);
	traverseStack(&S);
}

void initStack(PSTACK pS) {
	pS->pTop = (PNODE)malloc(sizeof(NODE));
	if (NULL == pS->pTop) {
		printf("动态分配内存失败!\n");
		exit(-1);
	}
	else {
		//初始化时,将pTop , pBottom一起指向一个不存放数据的头节点,并将pTop和pBottom所指向头节点的指针域清空。
		pS->pBottom = pS->pTop;
		pS->pTop->pNext = NULL;//pS->pBottom->pNext = NULL;
	}
}
void pushStack(PSTACK pS, int val) {
	PNODE pNew = (PNODE)malloc(sizeof(NODE));	//创建新节点
	pNew->data = val;							//将val的值防止到新节点的数据域
	pNew->pNext = pS->pTop;						//将pTop指向新节点的指针域
	pS->pTop = pNew;							//将新的节点放置到pTop

	return;
}


//遍历过程中,不应该破坏栈的完整性,所以pTop与pBottom均不能移动。遍历是自上而下的。
void traverseStack(PSTACK pS) {
	PNODE p = pS->pTop;
	while (p != pS->pBottom) {
		printf("%d  ", p->data);
		p = p->pNext;
	}
	printf("\n");
	return;
}

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

//把pS所指向的栈出栈一次,并把出栈的元素存入pVal形参所指向的变量中,如果出栈失败,返回false,否则返回true
bool popStack(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;
	}
}

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;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值