栈和队列是特殊的线性表。
栈
栈(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;
}
分享到:
相关推荐
实验三 栈和队列 3.1实验目的: (1) 熟悉栈的特点(先进后出)及栈的基本操作,如入栈、出栈等,掌握栈的基本操作在栈的顺序存储结构和链式存储结构上的实现; (2) 熟悉队列的特点(先进先出)及队列的基本操作...
栈和队列的基本操作实验报告 一、实验目的 1、熟练掌握栈和队列的基本操作在两种存储结构上的实现。 2、会用栈和队列解决简单的实际问题。 二、实验内容 题目:试写一个算法,判断依次读入的一个以@为结束符的...
栈和队列考试题 复习 栈和队列考试题 复习栈和队列考试题 复习
数据结构栈和队列的课程指导上几实验代码 相抵部分
栈和队列 源代码 参考数据结构(JAVA版)
数据结果实验之回文判断程序栈和队列基本操作数据结果实验之回文判断程序栈和队列基本操作数据结果实验之回文判断程序栈和队列基本操作
基于c语言数据结构中栈和队列思想的简单停车场管理系统,以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车...
实验题目:栈和队列的应用 二. 实验内容:迷宫问题 三.实验目的:掌握栈和队列的概念及工作原理,运用其原理完成实验题目中的内容。 四.实验要求:为了使学生更好的掌握与理解课堂上老师所讲的概念与原理,实验...
PPT内容是数据结构中有关栈和队列的知识,非常适合正在学习数据结构基础的同学
栈的算法和应用,以及相应习题,队列的算法及应用,学会利用栈和队列解决一些问题
有关于栈和队列的简介 有关于栈和队列的简介 有关于栈和队列的简介
栈和队列(基础知识,单项选择题,填空题,简答题,程序)
栈和队列的基本操作及其应用 1、掌握栈和队列的顺序存储结构和链式存储结构,以便在实际中灵活应用。 2、掌握栈和队列的特点,即后进先出和先进先出的原则。 3、掌握栈和队列的基本运算,如:入栈与出栈,入队与出队...
栈和队列PPT课件,想要了解栈和队列的同学,可以下载一下。
用链表实现栈和队列的操作,使链表操作更加成熟,熟练栈和队列的机制
数据结构课件及课堂笔记 栈和队列 计算机类
栈和队列 栈和队列是两种特殊的线性表,是操作受限的线性表,称限定性DS 讲解了栈和队列的操作与应用
1、熟练掌握栈和队列的基本操作在两种存储结构上的实现。 2、会用栈和队列解决简单的实际问题。 二、实验内容 (可任选或全做) 假设称正读数和反读数都相同的字符序列为“回文”,例如,‘abba’和‘abcba’是回文...
线性表之栈和队列数据类型的概述内容。主要介绍栈和队列的逻辑特征和操作特性。
1.栈和队列的共同特点是( )。 A.只允许在端点处插入和删除元素 B.都是先进后出 C.都是先进先出 D.没有共同点 2.用链接方式存储的队列,在进行插入运算时( ). A. 仅修改头指针 B. 头、尾指针都要修改 C. 仅修改尾...