当前访客身份:游客 [ 登录 | 加入 OSCHINA ]

代码分享

当前位置:
代码分享 » C/C++  » 编程基础
生命奇迹泉

数据结构之栈操作讲解

生命奇迹泉 发布于 2016年08月04日 22时, 0评/794阅
分享到: 
收藏 +0
0
数据结构之栈操作,包括栈创建,入栈,出栈和遍历
标签: <无>

代码片段(1) [全屏查看所有代码]

1. [代码][C/C++]代码     跳至 [1] [全屏预览]

/*
代码名称:栈讲解实例演示
代码时间:2016.08.03
代码讲解:本代码主要是详细介绍栈的创建,入栈,出栈,遍历的具体实现过程。
*/

#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 *;

typedef struct Stack
{
	PNODE pTop;//pTop为链表的头结点地址,类型为struct Node *,即PNODE;
	PNODE pBottom;// pBottom为链表的尾节点,但是此尾节点不通;
}STACK,*PSTACK;
//栈相当于一个尾节点被封住,以pTop为头结点的单向链表,入栈和出栈操作相当于往链表中插入和删除元素。


void init(PSTACK);
void push(PSTACK,int);
void traverse(PSTACK );
bool empty(PSTACK);
bool pop(PSTACK,int * );

int main()
{
	STACK S;//声明一个S栈
	int val;//声明变量,代表输出的链表元素的值
	init(&S);//用取地址改变S栈的内容,目的是造一个空栈
	push(&S,1);//创造节点1,即压栈
	push(&S,2);//创造节点2
	push(&S,3);
	push(&S,4);
	push(&S,5);
	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;//清除头结点的指针域
	}
}	
	void push(PSTACK pS,int val)
	{
		PNODE pNew=(PNODE)malloc(sizeof(NODE));//首先开辟一个新节点

		pNew->data=val;//然后给新节点数据域赋值
		pNew->pNext=pS->pTop;//pNext指向上一个节点
		pS->pTop=pNew;//最后pTop指向最上面的节点
	}
	
	void traverse(PSTACK pS)
	{
		printf("栈内元素为:");
		PNODE p=pS->pTop;//取一个临时的指针p用来从栈顶移动到栈底
		while(p!=pS->pBottom)
		{
			printf("%d",p->data);
			p=p->pNext;
		}
		printf("\n");
	}

	bool empty(PSTACK pS)
	{
		if(pS->pTop==pS->pBottom)
			return true;
		else
			return false;
	}
	
	bool pop(PSTACK pS,int *pVal)
	{
		if(empty(pS))	//pS本身存放的就是S的地址
		{
			return false;
		}
		else
		{
			PNODE r=pS->pTop;//取一个临时的r指针保存栈顶的元素数据,然后通过r释放栈顶元素所占内存
			pS->pTop=r->pNext;
			*pVal=r->data;
			free(r);//释放掉栈顶元素所占内存
			r=NULL;
			return true;
		}
	
	}


开源中国-程序员在线工具:Git代码托管 API文档大全(120+) JS在线编辑演示 二维码 更多»

开源从代码分享开始 分享代码
生命奇迹泉的其它代码 全部(1)...