`
housen1987
  • 浏览: 345567 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

栈和队列

阅读更多

栈和队列是特殊的线性表。

栈(stack)是限定在表尾进行插入或删除操作的线性表,表尾端称为栈顶(top),表头端称为栈底(bottom),不含元素的栈称为空栈。

栈是后进先出(last in first out,LIFO)。

栈的抽象数据定义:

 

ADT{
  数据对象:D
  数据关系:R1
  基本操作:
  initStack(&S)
    操作结果:构造一个空栈S
  destroyStack(&S)
    初始条件:栈S已存在
    操作结果:栈S被销毁
  clearStack(&S)
    初始条件:栈S已存在
    操作结果:栈S被清空
  stackEmpty(&S)
    初始条件:栈S已存在
    操作结果:若S为空栈,则返回TRUE,否则返回FALSE
  stackLength(&S)
    初始条件:栈S已存在
    操作结果:返回S的元素个数
  getTop(&S,e)
    初始条件:栈S已存在,且非空
    操作结果:用e返回S的栈顶元素
  push(&S,e)
    初始条件:栈S已存在
    操作结果:插入元素e为新的栈顶元素
  pop(&S,e)
    初始条件:栈S已存在且非空
    操作结果:删除S的栈顶元素,并用e返回其值
  stackTraverse(&S,visit())
    初始条件:栈S已存在
    操作结果:使用visit函数遍历栈S
}ADT Stack

 栈的表示和实现

栈有两种表示方法:顺序栈和链式栈

顺序栈即栈的顺序存储结构式利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同事附设指针top指示栈顶元素在顺序栈中的位置。

栈的初始化操作为:

  按设定的初始分配量进行第一次存储分配,base可称为栈底指针,在顺序栈中,它始终指定栈底的位置,若base的值为NULL,则表明栈结构不存在,称top为栈顶指针,其初值指向栈底,即top=base作为栈空的标记,当新元素进栈时,top+1,删除栈顶元素时,top-1,非空栈中的栈顶指针始终在栈顶元素的下一个位置上。

 

栈的C语言表示:

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

#define TRUE 1
#define FALSE 0 
#define STACK_INIT_SIZE 5

typedef int elemType;

typedef struct sqStack{
	elemType *base;
	elemType *top;
	int length;
	int maxSize;
}sqStack;

/*初始化一个栈*/
void initStack(sqStack *S){
	elemType *p = malloc(STACK_INIT_SIZE * sizeof(elemType));
	if(!p){
		printf("空间分配失败!\n");
		exit(0);
	}else{
		printf("空间分配成功!\n");
		S->length = 0;
		S->maxSize = STACK_INIT_SIZE;
		S->base = S->top = p;	
	}
}
/*清空一个栈*/
void clearStack(sqStack *S){
	S->length = 0;
	S->top = S->base;
}
/*销毁一个栈*/
void destroyStack(sqStack *S){
	clearStack(S);
	free(S->base);
	S->base = S->top = NULL;
	S->maxSize = 0;
}
/*判断一个栈是否为空*/
int stackEmpty(sqStack *S){
	return S->top == S->base ? 1 : 0;
}
/*获取栈中元素的个数*/
int stackLength(sqStack *S){
	return S->length;
}
/*用e返回栈顶元素*/
void getTop(sqStack *S,elemType e){
	if(S->base == S->top){
		printf("该栈已空!\n");
		exit(0);
	}else{
		e= *--(S->top);
	}
}
/*向栈顶插入元素e*/
void push(sqStack *S,elemType e){
	if(S->top - S->base == S->maxSize){
		elemType *p = realloc(S->base,(S->maxSize+1)*sizeof(elemType));
		if(!p){
			printf("空间分配失败!\n");
			exit(0);
		}else{
			printf("空间再分配成功!\n");
		  S->maxSize++;
			S->base = p;
			S->top = S->base + S->length;
		}
	}
	S->length++;
	*(S->top) = e;
	S->top++;
}
/*删除栈顶元素,并用e返回其值*/
elemType pop(sqStack *S){
	if(S->base == S->top){
		printf("该栈已空!\n");
		exit(0);
	}else{
		S->length--;
		return *(--S->top);
	}
}
/*遍历栈*/
void stackTraverse(sqStack *S,void (*visit)(elemType)){
	if(S->base == S->top){
		printf("\n该栈已空!\n");
		exit(0);
	}else{
		elemType *p= S->top;
		while(S->base!=p){
			p--;
			visit(*p);
		}
	}
}

void visit(elemType e){
	printf("%d ",e);	
}

int main(){
	sqStack S;
	initStack(&S);
	int i;
	for(i=1;i<=6;i++){
		push(&S,i*2);
	}
	stackTraverse(&S,visit);
	elemType e = pop(&S);
	printf("\npop操作取得的值是:%d\n",e);
	stackTraverse(&S,visit);
	clearStack(&S);
	stackTraverse(&S,visit);
	return 0;
}
 
分享到:
评论

相关推荐

    数据结构栈和队列试题及答案

    队列和栈都是运算受限的线性表,只允许在表的一端进行特定的插入和删除操作,该说法正确。 18. **栈和队列的基本属性** 栈和队列都是线性表,但它们分别采用了LIFO和FIFO的规则来约束插入和删除操作,该说法正确...

    利用栈和队列实现迷宫

    "利用栈和队列实现迷宫" 通过栈和队列两种不同的方法来实现迷宫问题。队列方法求出的迷宫路径是最短路径。迷宫问题是指在一个迷宫中找到从起点到终点的路径。这里我们使用栈和队列两种数据结构来解决这个问题。 栈...

    zhanheduilie.rar_栈和队列

    栈和队列是计算机科学中基础且重要的数据结构,它们在程序设计中有着广泛的应用。在本资料"zhanheduilie.ppt"中,详细讲述了这两种数据结构的原理、特性以及实际应用。 栈(Stack)是一种后进先出(LIFO, Last In ...

    Python实现栈和队列的简单操作方法示例

    本篇文章将深入探讨Python中如何实现栈(Stack)和队列(Queue)这两种基础数据结构。 栈是一种后进先出(Last In, First Out, LIFO)的数据结构,常用于临时存储和快速访问数据。在Python中,由于列表(List)的...

    栈和队列笔记包括栈和队列的定义、顺序栈出入栈、链栈的出入栈操作、顺序队列基本操作、链式队列基本操作等

    ### 栈和队列知识点详解 #### 一、栈的定义 栈是一种特殊的线性数据结构,其特点是只允许在一端进行数据的插入和删除操作,遵循“先进后出”(First In Last Out, FILO)的原则。在这个数据结构中,最新加入的数据...

    栈和队列的基本操作

    "栈和队列的基本操作" 栈和队列是计算机科学中两个基本的数据结构,它们的基本操作包括进栈、出栈、进队、出队等。栈是一种后进先出的数据结构,即最后一个入栈的元素将是第一个出栈的元素。队列是一种先进先出的...

    数据结构栈和队列

    栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。

    栈和队列PPT

    栈和队列PPT课件,想要了解栈和队列的同学,可以下载一下。

    栈和队列源代码

    在计算机科学中,栈和队列是两种基本的数据结构,它们在编程中有着广泛的应用。栈被称为“后进先出”(LIFO, Last In First Out)数据结构,而队列则是“先进先出”(FIFO, First In First Out)数据结构。这两种...

    数据结构栈和队列(参考代码)

    ### 数据结构栈和队列知识点解析 #### 一、栈的基本概念与操作 **栈**是一种特殊的线性表,只允许在一端进行插入和删除操作,这一端被称为栈顶,另一端被称为栈底。栈遵循先进后出(First In Last Out, FILO)的...

    zhangheduilie_currentqcb_栈和队列_

    在IT领域,栈和队列是两种非常基础且重要的数据结构,它们在计算机科学和软件开发中扮演着不可或缺的角色。栈通常被称为“后进先出”(LIFO, Last In First Out)的数据结构,而队列则被称为“先进先出”(FIFO, ...

    数据结构中栈和队列思想的停车场管理系统

    基于c语言数据结构中栈和队列思想的简单停车场管理系统,以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车...

    栈和队列详解

    "栈和队列详解" 栈和队列是数据结构中两个基本的数据结构概念,本文将详细介绍栈和队列的定义、原理、操作和应用。 栈的定义和原理 栈是一种后进先出(Last-In-First-Out,LIFO)的数据结构,栈中的元素按照加入...

    stack-and-queue-.zip_栈和队列

    栈和队列是两种最基本且常用的数据结构,它们在程序设计中扮演着重要角色。本篇文章将详细探讨这两种数据结构以及它们在实际应用中的作用。 栈(Stack)是一种“后进先出”(Last In, First Out,简称LIFO)的数据...

    02-栈和队列.zip

    栈和队列是数据结构中的基础概念,它们在计算机科学和编程中扮演着重要的角色。在深入探讨这两个概念之前,让我们先理解它们的基本定义。 栈(Stack)是一种后进先出(Last In First Out,简称LIFO)的数据结构。这...

    栈和队列 实验报告

    实验报告——栈和队列 一、实验目的 本次实验的主要目标是深入理解和熟练掌握两种基本数据结构——栈和队列的实现。首先,通过编程实现顺序栈,旨在熟悉栈的“后进先出”(LIFO)特性,以及相关的操作如初始化、...

    栈和队列的操作

    实验三 栈和队列的操作 1. 实验目的: 1)掌握栈的顺序存储结构和链式存储结构; 2)掌握队列的顺序存储结构; 3)验证栈和队列的基本操作实现。 2. 实验内容: 1)编程实现栈的以下基本操作:建栈,取栈顶元素,...

Global site tag (gtag.js) - Google Analytics