3.1、栈的相关知识

1、栈的定义
    一种可以实现“先进后出”的存储结构;
    栈类似于箱子

    栈和堆的主要区别是,内存的分配方式不一样,栈是按照压栈出栈的方式分配内存,实现先进后出的数据结构;堆是按一种叫堆排序的方式分配内存。

2、栈的分类
    静态栈(内核以数组为存储)
    动态栈(内核以链表为存储)

3、算法
    出栈
    压栈

4、具体程序演示

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

typedef struct Node  //先造出节点
{
	int date;
	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 pop(PSTACK, int *);
void clear(PSTACK pS);

int main(void)
{
	STACK S;  //STACK等价于struct stack
	int val;
	init(&S);  //初始化,目的是造出一个空栈
	push(&S,1);   // 压栈
	push(&S,2);    //压栈
	push(&S,5);
	push(&S,20);
	push(&S,29);
	traverse(&S);

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


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


	return 0;

}

//初始化的目的是
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;  //pS->pBottom->pNext = NULL;
	}

}

void push(PSTACK pS,int val)
{
	PNODE pNew = (PNODE)malloc(sizeof(NODE));
	pNew->date = val;
	pNew->pNext = pS->pTop; //pS->Top不能改成pS->pBottom
	pS->pTop = pNew;

	return;
}


void traverse(PSTACK pS)
{
	PNODE p = pS->pTop ;
	while(p != pS->pBottom )
	{
		printf("%d ", p->date);
		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 pop(PSTACK pS, int * pVal)
{
	if(empty(pS))  //pS本身存放的就是S的地址
	{
		return false;
	}
	else 
	{
		PNODE r = pS->pTop ;
		*pVal = r->date ;
		pS->pTop = r->pNext ;
		free(r);
		r = NULL;

		return true;
	}
	
}

//clear清空
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 ;
	}
}

5、应用 

    函数调用
    中断
    表达式求值
    内存分配
    缓冲处理
    迷宫
 

猜你喜欢

转载自blog.csdn.net/GUA8122HOU/article/details/87908469