对栈的操作和算法实现

Posted 为幸福写歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对栈的操作和算法实现相关的知识,希望对你有一定的参考价值。

一、栈的定义

从数据结构角度看,栈也是线性表,其特殊性在于栈的基本操作都是线性操作的子集,它是操作受限的线性表。

栈(stack)是限定仅在表尾进行插入或删除操作的线性表。

栈一般分为两种:

静态栈:用数组实现;

动态栈:用链表实现。

一般用的比较多的都是动态栈。如果学会了链表,其实对栈的操作就比较简单了。

 

二、栈的结构

空栈的结构:(其实就是栈顶和栈顶都指向一个不存放有效数据的头结点)

技术分享

存有结点的栈结构:(栈顶指针指向栈顶结点,栈底指针指向头结点)

技术分享

三、用C语言实现

 

/*
	2016年9月17日11:35:35
	栈的操作和算法
*/
#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_stack(PSTACK pS);      //初始化栈
void push_stack(PSTACK pS, int val);
void traverse_stack(PSTACK pS);
bool is_empty(PSTACK pS);
bool pop_stack(PSTACK pS, int * pVal);
void clear_stack(PSTACK pS);

int main(void)
{
	STACK S;
	int val;
	
	init_stack(&S);
	
	push_stack(&S, 1);
	push_stack(&S, 2);
	push_stack(&S, 3);
	push_stack(&S, 4);
	push_stack(&S, 5);
	traverse_stack(&S);
	clear_stack(&S);
	traverse_stack(&S);
	
/* 	if(pop_stack(&S, &val))
	{
		printf("出栈成功,出栈的值为:%d\n",val);
	}
	else
	{
		printf("出栈失败,栈为空!\n");
	}
	traverse_stack(&S); */
	
	return 0;
}

void init_stack(PSTACK pS)     //初始化栈
{
	PNODE pNew = (PNODE)malloc(sizeof(NODE));   //造出一个栈的头结点
	if(NULL == pNew)
	{
		printf("内存分配失败,程序终止!\n");
		exit(-1);
	}
	
	pS->pTop = pNew;
	pS->pBottom = pS->pTop;
	pNew->pNext = NULL;
}

void push_stack(PSTACK pS, int val)    //压栈     
{
	PNODE pNew = (PNODE)malloc(sizeof(NODE));   
	if(NULL == pNew)
	{
		printf("内存分配失败,程序终止!\n");
		exit(-1);
	}
	
	pNew->data = val;
	pNew->pNext = pS->pTop;    //不能是pNew->pNext = pBottom;因为当有多个节点时,pTop不等于pBottom;
	pS->pTop = pNew;
	
	return;
}

void traverse_stack(PSTACK pS)    //遍历输出,从栈顶开始遍历
{
	PNODE p = pS->pTop;
	
	while(pS->pBottom != p)
	{
		printf("  %d   \n", p->data);
		p = p->pNext;
	}
	printf("\n");
	
	return;
}

bool is_empty(PSTACK pS)   //判断是否为空
{
	if(pS->pTop == pS->pBottom)
		return true;
	else 
		return false;
}

bool pop_stack(PSTACK pS, int * pVal)   //出栈
{
	if(is_empty(pS))    //先判断是否为空
	{
		return false;
	}
	else
	{
		PNODE p = pS->pTop;
		*pVal = p->data;
		pS->pTop = p->pNext;
		free(p);
		p = NULL;
		
		return true;
	}
}

void clear_stack(PSTACK pS)   //清空栈
{
	PNODE p, q;
	p = pS->pTop;
	q = NULL;
	
	while(pS->pBottom != p)
	{
		q = p->pNext;
		free(p);
		p = q;
	}
	
	pS->pTop = pS->pBottom;
	
	return;
}

 

 







以上是关于对栈的操作和算法实现的主要内容,如果未能解决你的问题,请参考以下文章

计算器的算法实现

『数据结构与算法』栈:原理与实现

数据结构第五篇——栈和队列

数据结构第五篇——栈和队列

[算法] leetcode_括号匹配问题

数据结构与算法--栈和队列