栈和队列的总结

栈和队列的总结:

(有时候感觉自己掌握了,栈和队列,可是在写的时候会遇到不同的情况,就不会处理了,因此在这里进行总结下)。

栈:

栈是一端受限,一段允许进行操作的线性表。我自己理解时,会将它理解成一个装书的盒子。放书,取书,就是进行的操作。这个的特点就是,你放了一踏书,现在你想取书,你只能先把上面的书一个个取出来,即:先放的后取,后放的先取。放在栈上说,就是先进后出。

明白了栈的定义,现在要实际的实际,首先是它的逻辑结构:线性表。它是线性的。

现在是它的存储结构:最常采用的是顺序存储和链式存储(见好多书或资料都说的最常采用的是顺序存储和链式存储,百度了下不常见的没有找到)。其中顺序存储用数组,链式存储用链表。

顺序存储:

先进行分析下:首先要分配一个足够大的数组(这里就出现了一个问题,要是分配的空间小,就会出现溢出的情况,这是一个潜在的隐患,但是要是分配的太过大,又会出现浪费空间,这里要做好一个估计,所以呢,我还是喜欢链式存储,要多少就给多少,不用担心空间太小或浪费),现在有了这个数组,需要的还有,必须有个东西能一个控制一端不让操作(数组的前端从下标为0开始),一端要进行增删,这样就可以说是具备了栈有的特点,不让操作的叫栈底,进行操作的是栈顶

栈的定义:(用的是顺序存储)

#define Max 100;

typedef int Datetype;

typedef struct

{

Datetype date[Max];

Int top;   //控制栈顶

}SeqStack,*PseqStack;

完成了定义,就要进行对栈的各种操作:初始化,判空,进栈,出栈,得到栈顶元素,销毁栈…….

初始化:

PseqStack Init-SeqStack( )

{

PseqStack S;

S=(PseqStack)malloc(sizeof(SeqStack)); //头文件要包括stdilb.h

S->top=-1;

return S;

}

判空:

Int IsEmpyt(PseqStack S)

{

if(S->top==-1)

return 1;

else

return 0;

}

进栈:

int  Push(PseqStack S,Datetype x)

{

If(S->top==Max-1)

return 0;

else

S->top++;

S->date[S->top]=x;

return 1;

}

出栈:

int  Pop(PseqStack S,int *x)

{

if(isEmpty(PseqStack S)==1)

return 0;

else

{

*x=S->date[S->top];

S->top--;

return 1;

}

}

int GetTopdate(PseqStack S)

{

if(isEmpty(PseqStack S)==1)

return 0;

else

return S->date[s->top]

}

int Destroy(PseqStack *S)

{

if(*S)

{ free(s);

*S=NULL;

return 1;

}

return 0;

}

下面来看下链式存储:

控制入栈出栈的端口,栈顶一般是链表的头,第一个节点,栈底一般是最后一个节点。(可以避免顺序存储的溢出),同时节省空间,要多少,申请多少。链表的运用中同时要注意一旦申请了,最后要记得释放,不然会带来不可预计的后果。下面是链式存储的一些操作。

typedef struct Stacknode

{

int date;

struct Stacknode *next;

}slStacktype;

入栈:

Int push(slStacktype *top,int x)

{

slStacktype *p;

if((p=( slStacktype *)malloc(sizeof(slStacktype )))==NULL)  //申请节点

return 0;

p->date=x;

p->next=top->next;      //用的是头插法,top始终是栈顶。

top->next =p;

return 1;

}

出栈:

int pop(slStacktype *top)

{

slStacktype *p;

int x;

if(top->next==NULL)

return NULL;

p=top->next;

top->next=p->next; //删除节点,用x记录要删除的元素。

x=p->date;

free(p);

return x;

}

对我来说,栈和队列,其实很相似,只不过是控制的位置不同。

队列:是一种限定性的线性表。这样理解比较好,学生排队买饭。有什么特点呢?当然,你先来,就先打饭,先吃饭。抽象到队列上说,有队头,队尾,要想加入(入队),只能从队尾加,想走(出队),只能从队头走。即:先进先出。

和栈一样,它常见的两种存储是顺序存储和链式存储。

用顺序存储时,会遇到这样的情况,数组并没有满,却入不了队(假溢出),原因在于队头没有在数组的0下标处。

说下循环队列的操作吧。(理解取余)

定义:

typedef struct

{

int date[Max];

int rear;   //控制队尾

int front;//控制队头

}CirQueue;

  ① 置队空

void InitQueue(CirQueue *Q)

{

Q->front=Q->rear=0;

Q->count=0;     //计数器置0

}

  ② 判队空

int QueueEmpty(CirQueue *Q)

{

return Q->count==0;  //队列无元素为空

}

  ③ 判队满

int QueueFull(CirQueue *Q)

{

return Q->count==Max;  //队中元素个数等于max时队满

}

  ④ 入队

void EnQueue(CirQueuq *Q,int x)

{

if(QueueFull((Q))

Error("Queue overflow");      //队满上溢

Q->count ++;                         //队列元素个数加1

Q->data[Q->rear]=x;                  //新元素插入队尾

Q->rear=(Q->rear+1)%Max;           //循环意义下将尾指针加1

  ⑤ 出队

DataType DeQueue(CirQueue *Q)

{

int temp;

if(QueueEmpty((Q))

Error("Queue underflow");      //队空下溢

temp=Q->data[Q->front];

Q->count--;                        //队列元素个数减1

Q->front=(Q->front+1)%Max;         //循环意义下的头指针加1

return temp;

}

  ⑥取队头元素

DataType QueueFront(CirQueue *Q)

{

if(QueueEmpty(Q))

Error("Queue if empty.");

return Q->data[Q->front];

}

By:暖暖

2014.11.19

时间: 2024-11-09 00:49:56

栈和队列的总结的相关文章

快速记忆数组栈和队列函数push()和shift()

在js中,对数组的操作是比较常见的,有时候,我们需要模拟栈和队列的特性才能实现需求,今天来给大家用通俗易懂.简洁明了的几行文字,来告诉大家栈和队列的几个函数,如何快速记住. 首先,概念还是要知道的: 栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素:从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻

3-3-行编辑程序-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第3章  栈和队列 - 行编辑程序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? SequenceStack.c        相关测试数据下载  链接? 无数据

用栈实现队列的效果

用两个栈实现队列的效果,可以入栈,出栈,判空等... 实现的栈基本功能 lstack.h #ifndef _LSTACK_H #define _LSTACK_H #include <stdexcept> using namespace std; // 基于链式表的堆栈 class Stack { public: // 构造过程中初始化为空堆栈 Stack (void) : m_top (NULL) {} // 析构过程中销毁剩余的节点 ~Stack (void) { for (Node* ne

javascript中的栈、队列。

                       javascript中的栈.队列 栈方法     栈是一种LIFO(后进先出)的数据结构,在js中实现只需用到2个函数 push()  接受参数并将其放置数组尾,并返回修改后的数组长度. pop()  移除数组尾的最后一项,并返回移除项的值. 事例: var colors = new Array();var count = colors.push("red","green"); count = colors.push(&

数据结构之栈和队列

数据结构学习继续向前推进,之前对线性表进行了学习,现在我们进入栈和队列的学习.同样我们先学习一些基本概念以及堆栈的ADT. 栈和队列是两种中重要的线性结构.从数据结构角度看,栈和队列也是线性表,只不过是受限的线性表.因此可以称为限定性数据结构.但从数据类型来看,他们是和线性表大不相同的两类重要的抽象数据类型. 栈:(stack)是限定仅在表尾进行相应插入和删除操作的线性表.因此,对栈来说,表尾有其特殊含义,称为栈顶,表头称为栈底,不含元素的空表称为空栈.栈一个重要特性就是后进先出.OK,我们来看

图解堆算法、链表、栈与队列(Mark)

原文地址: 图解堆算法.链表.栈与队列(多图预警) 堆(heap),是一类特殊的数据结构的统称.它通常被看作一棵树的数组对象.在队列中,调度程序反复提取队列中的第一个作业并运行,因为实际情况中某些时间较短的任务却可能需要等待很长时间才能开始执行,或者某些不短小.但很重要的作业,同样应当拥有优先权.而堆就是为了解决此类问题而设计的数据结构.--

第三章:1.栈和队列 -- 栈的表示及实现

前言: 栈和队列 是两种重要的线性结构.从数据结构角度来看,栈和队列也是线性表,它的特殊性在于其操作是线性表的子集,是操作受限的线性表,因此可以称作限定性的数据结构. (限定性:如.人为的规定线性表只能从表尾插入和删除结点数据元素,那么这样的线性表就是栈) 目录: 1.栈 2.栈的应用举例 3.栈与递归的实现 4.队列 5.离散事件模型 正文: 栈的定义 栈(stack) 如上所说,就是限定只能在表尾进行插入和删除的线性表.表尾 称为 栈顶(top), 表头 称为 栈底 (bottom),没有数

数据结构和算法分析(9)表栈和队列的实际应用(一)

    在接下来的几篇博文中,将介绍表.栈.队列在编程实践中的应用.     (1)表达式求值:     输入一个中缀表达式,操作符包括(+ - * / ^).转化为后缀表达式之后并计算表达式的值: 要求: 1.输入的中缀表达式必须是一个完整的字符串: 2.不限制数字的位数和正负,负数用()括起来: 代码如下: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 #define EmptyT

用两个栈实现队列-剑指Offer

用两个栈实现队列 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路 一个栈的顺序是“后进先出”,再用一个栈把顺序颠倒过来就满足队列的“先进先出”规则了 用两个stack实现,stack1负责进队列,然后从stack2弹栈出队列,若stack2为空,再从stack1弹出到stack2 代码 import java.util.Stack; public class Solution { Stack<Integer> stack1 = new St

(hdu step 8.1.1)ACboy needs your help again!(STL中栈和队列的基本使用)

题目: ACboy needs your help again! Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 73 Accepted Submission(s): 57   Problem Description ACboy was kidnapped!! he miss his mother very much and is very