栈和队列是特殊的线性表。
栈
栈(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;
}
分享到:
相关推荐
"栈和队列的基本操作" 栈和队列是计算机科学中两个基本的数据结构,它们的基本操作包括进栈、出栈、进队、出队等。栈是一种后进先出的数据结构,即最后一个入栈的元素将是第一个出栈的元素。队列是一种先进先出的...
【栈和队列的基本概念】 栈是一种特殊的线性表,具有“后进先出”(LIFO,Last In First Out)的特点。栈的主要操作包括入栈(Push)和出栈(Pop)。入栈操作是在栈顶添加元素,而出栈则是删除栈顶元素。栈的应用...
队列和栈都是运算受限的线性表,只允许在表的一端进行特定的插入和删除操作,该说法正确。 18. **栈和队列的基本属性** 栈和队列都是线性表,但它们分别采用了LIFO和FIFO的规则来约束插入和删除操作,该说法正确...
在计算机科学中,栈和队列是两种基本的数据结构,它们在编程中有着广泛的应用。栈被称为“后进先出”(LIFO, Last In First Out)数据结构,而队列则是“先进先出”(FIFO, First In First Out)数据结构。这两种...
### 数据结构栈和队列知识点解析 #### 一、栈的基本概念与操作 **栈**是一种特殊的线性表,只允许在一端进行插入和删除操作,这一端被称为栈顶,另一端被称为栈底。栈遵循先进后出(First In Last Out, FILO)的...
根据给定的信息,本文将详细解释如何利用栈和队列这两种数据结构来设计一个高效的停车管理系统。我们将重点探讨栈和队列的特点,并说明如何利用这些特点解决停车问题。 ### 栈与队列的基础概念 #### 栈(Stack) ...
本话题聚焦于"回文判断程序",并涉及到"栈"和"队列"这两种基本数据结构的操作。回文是一种正读反读都能读通的字符串,如"level"或"madam"。在判断一个字符串是否为回文时,栈和队列可以发挥重要作用。 首先,我们来...
### 栈和队列的基本操作实现及其应用实验报告 #### 实验目的 1. **熟练掌握栈和队列的基本操作**:在数组和链表两种存储结构上实现栈和队列的基本操作。 2. **应用栈和队列解决实际问题**:通过具体的编程练习,...
### 栈和队列基础知识详解 #### 栈与队列的特性及作用 栈和队列作为两种基本的数据结构,在程序设计中扮演着至关重要的角色。**栈**遵循后进先出(Last In First Out,LIFO)的原则,类似于一叠盘子,你只能在最...
### 数据结构实验报告《二、栈和队列的运用》 #### 栈和队列的基础概念及应用 在计算机科学中,数据结构是用于组织和存储数据的方式,它允许高效地访问和修改数据。其中,栈(Stack)和队列(Queue)是最基本的...
"利用栈和队列实现迷宫" 通过栈和队列两种不同的方法来实现迷宫问题。队列方法求出的迷宫路径是最短路径。迷宫问题是指在一个迷宫中找到从起点到终点的路径。这里我们使用栈和队列两种数据结构来解决这个问题。 栈...
### 栈和队列的算法以及应用 #### 栈的基本概念与操作 栈是一种线性数据结构,其特点是只能在一端进行插入或删除操作,通常称为栈顶(top)。这种特性使得栈的操作遵循“后进先出”(Last In First Out, LIFO)的原则...
实验报告——栈和队列 一、实验目的 本次实验的主要目标是深入理解和熟练掌握两种基本数据结构——栈和队列的实现。首先,通过编程实现顺序栈,旨在熟悉栈的“后进先出”(LIFO)特性,以及相关的操作如初始化、...
在这个"数据结构试验2-栈和队列实验报告含源码"中,我们将深入探讨两个基本且至关重要的数据结构——栈和队列。 栈(Stack)是一种后进先出(LIFO,Last In First Out)的数据结构。想象一个堆叠的盘子,最后一个放...
"栈和队列详解" 栈和队列是数据结构中两个基本的数据结构概念,本文将详细介绍栈和队列的定义、原理、操作和应用。 栈的定义和原理 栈是一种后进先出(Last-In-First-Out,LIFO)的数据结构,栈中的元素按照加入...
数据结构栈和队列解决迷宫问题 本文档详细介绍了利用栈和队列解决迷宫问题的步骤,对于初学者学习数据结构能很好的进行辅导。本文档主要涉及到数据结构的两个重要概念:栈和队列,并介绍了如何使用这两个数据结构来...
【栈和队列的基本操作实现及其应用】 栈和队列是两种重要的数据结构,它们在计算机科学和软件工程中有着广泛的应用。本实验旨在通过实际操作加深对这两种数据结构的理解,并学习如何用它们来解决实际问题。 栈是一...
栈和队列是两种基础且重要的数据结构,广泛应用于各种算法和程序设计中。本课件及课堂笔记将深入探讨这两种数据结构的概念、特性以及它们在实际问题中的应用。 栈(Stack)是一种后进先出(LIFO,Last In First Out...
**实验背景**:本实验旨在加深学生对数据结构中栈和队列的理解,并通过实际编程应用的方式掌握这两种数据结构的特点及其应用场景。栈和队列作为两种基本的数据结构,在算法设计、程序开发等多个领域都有着广泛的应用...
队列常用于模拟现实生活中排队等候的情况,例如任务调度、打印作业队列和缓冲区管理等。队列的基本操作包括初始化队列、销毁队列、清空队列、判断队列是否为空、获取队列长度、入队和出队。 在实际实现中,栈和队列...