(郝斌讲学)数据结构学习篇(四)---栈的CRUD操作

栈类似于箱子。

静态栈、动态栈。

关于栈的操作

#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 empty(PSTACK);
bool pop(PSTACK, int *);
void clear(PSTACK p);

int main(void)
{
	STACK s;
	int val;

	init(&s);
	push(&s, 1);
	push(&s, 2);
	push(&s, 3);
	push(&s, 4);
	push(&s, 5);
	push(&s, 6);
	push(&s, 7);
	traverse(&s);

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

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

	return 0;
}

//完成一个栈的初始化
void init(PSTACK p)
{
	p->pTop = (PNODE)malloc(sizeof(NODE));
	if(NULL == p->pTop)
	{
		printf("动态内存分配失败\n");
		exit(-1);
	}
	else
	{
		p->pBottom = p->pTop;
		p->pTop->pNext = NULL;
	}

}

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

void traverse(PSTACK p)
{
	PNODE r = p->pTop;
	while(r != p->pBottom)
	{
		printf("%d ", r->data);
		r = r->pNext;
	}
	printf("\n");

	return;
}

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

//把p所指向的栈出栈一次,并把出栈的元素存入pval形参所指的变量中
bool pop(PSTACK p, int * pval)
{
	if(empty(p))
	{
		return false;
	}
	else
	{
		PNODE r = p->pTop;
		*pval = r->data;
		p->pTop = r->pNext;
		free(r);
		r = NULL;

		return true;
	}
}

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

		while(r != p->pBottom)
		{
			t = r->pNext;
			free(r);
			r = t;
		}
		p->pTop = p->pBottom;
	}
}

栈主要用于表达式求值,缓冲处理,迷宫,函数调用,中断...

时间: 2024-08-29 13:55:14

(郝斌讲学)数据结构学习篇(四)---栈的CRUD操作的相关文章

小猪的数据结构学习笔记(四)

小猪的数据结构学习笔记(四) 线性表之静态链表 --转载请注明出处:coder-pig 本章引言: 在二,三中中我们分别学习了顺序表中的线性表与单链表,线性表有点类似于 我们前面所学的数组,而单链表使用的最多的是指针,这里问个简单的问题, 如果是在以前没有指针的话,前辈先人们怎么实现单链表呢?大家思考下! 没有指针,那么用什么来代替呢?前辈先人们非常机智,想出了使用下标+游标的方式 来实现单链表的效果!也就是今天要讲的--静态链表! 当然你也可以直接跳过本章,因为有了单链表就没有必要用静态链表了

数据结构学习笔记之栈

栈(stack)  是限定仅在表尾进行插入或删除操作的线性表.因此,对栈来说,表尾端有其特殊含义,称为栈项(top),相应地,表头端称为栈底(bottom).不含元素的空表称为空栈. 栈有两种存储表示方法:顺序栈和链栈.顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置.通常的习惯做法是以top=0表示空栈,鉴于C语言中数组的下标约定从0开始,则当以C作描述语言时,如此设定会带来很大不便:另一方面,由于栈在使用过程

[原创]java WEB学习笔记6:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

数据结构学习(三)、栈

栈是一种特殊的线性表.大家可能会有疑问,竟然栈是一种线性表,那为什么还要定义栈呢?因为栈的引入简化了程序设计的问题, 使我们思考范围更小,只需关注top位置.线性表分为顺序存储和链式存储,栈是线性表,所以也有这两种存储方式.同样, 栈作为一种特殊的线性表,也同样存在这两种存储方式.我们先来看栈的顺序存储结构. 顺序栈结构体如下: #define MAXSIZE /*存储空间初始分配量*/ typedef int ElemType;/*存放的数据类型*/ typedef struct { Elem

(郝斌讲学)数据结构学习篇(五)---队列的CRUD操作

队列 什么是队列? 一种可以实现"先进先出"的存储结构. 出队  入队  -->>队列 出栈  压栈  -->>栈 链式队列 ---用链表实现的 静态队列 ---用数组实现的 静态队列通常必须是循环队列.. 039.循环队列需要几个参数来确定极其含义的讲解 front代表的是队列的第一个元素 rear代表的是队列的最后一个有效元素的下一个元素 队列为空: front和rear的值相等,但不一定为零 队列初始化 front和rear的值都是零. 循环队列入队的伪算

(郝斌讲学)数据结构学习篇(七)---树

树定义        专业定义:有且只有一个称为根的节点,有若干个互不相交的子树,这些子树的本身也是一棵树.        通俗的定义:树是由节点和边组成:每个节点只有一个父节点但可以有多个子节点:但有一个节点例外,该节点没有父节点,此节点称为根节点.   专业术语        节点 父节点 子节点 子孙 堂兄弟 深度 深度:从根节点到底层节点的层数称之为深度.根节点是第一层. 叶子节点:没有子节点的节点. 非终端节点:实际上就是非叶子节点. 度:子节点的个数称之为度.   树的分类     

(郝斌讲学)数据结构学习篇(三)---链表的CRUD操作

024.链表的创建和链表遍历的算法演示 <span style="font-size:14px;">#include <stdio.h> #include <malloc.h> #include <stdlib.h> typedef struct Node { int data; struct Node *pNext; }NODE, *PNODE; //NODE 等价于struct Node, PNODE 等价于struct Node *

Java数据结构和算法(四)——栈

stack,中文翻译为堆栈,其实指的是栈,heap,堆.这里讲的是数据结构的栈,不是内存分配里面的堆和栈. 栈是先进后出的数据的结构,好比你碟子一个一个堆起来,最后放的那个是堆在最上面的. 队列就是排队买苹果,先去的那个可以先买. 栈 public class Stack { private int array[]; private int max; private int top; public Stack(int max){ this.max = max; array = new int[m

oracle学习篇四:多表查询

-----------------产生笛卡儿积------------------------------------ select * from emp,dept; --不带条件时,记录数为14*4 =56条记录 select * from emp cross join dept;--交叉连接,同上 select count(*)from emp; ---左连接( 返回包括左表中的所有记录和右表中联结字段相等的记录 ) select d.dname,e.ename from emp e,dep