首页 > 其他分享 >栈和队列

栈和队列

时间:2022-12-14 10:14:19浏览次数:35  
标签:return 队列 top base front rear

3.1 栈

栈是限定插入或删除操作只能在表尾进行的线性表;后进先出

 

顺序栈:类似于顺序表,指向表尾(最后插入的位置)作为栈顶指针

在非空栈中,栈顶指针top并不是指向栈顶元素,而是始终指在栈顶元素的下一个位置上——top指针永远指向下一次要插入的位置

  • base = NULL,说明栈不存在。

  • base = top 作为栈空的标志。

  • top-base 的值为栈的长度。

 

类型定义

1  #define STACK_ INIT_ SIZE 100     //存储空间初始分配量
2  #define STACKINCREMENT 10      //存储空间分配增量
3  ​
4  顺序栈的类型定义:
5  typedef struct  {  
6     SElemType       *base;                              
7     SElemType       *top;                   //栈顶指针
8           int              stacksize;    //当前分配的存储空间,以元素为单位
9  } SqStack ;                  

初始化

1  Status InitStack (SqStack &S )     // 构造一个空栈S
2  { S.base = (SElemType *) malloc(STACK_INIT_SIZE * sizeof(SElemType)); // S.base = new  SElemType [STACK_INIT_SIZE];
3     if (! S.base ) exit(OVERFLOW); //存储分配失败
4     S.top =S.base;
5     S.stacksize =STACK_INIT_SIZE;
6     return OK;
7   }  

插入元素

 1 Status Push (SqStack &S , SElemType e )
 2  {                     
 3  if(S.top - S.base >= S.stacksize)
 4    { // 当前存储空间已满,增加分配         
 5      S.base = (SElemType *)realloc(S.base,                                                                               
 6          (S.stacksize+STACKINCREMENT)*sizeof (SElemType));
 7      if (! S.base ) exit(OVERFLOW); // 存储分配失败
 8      S.top =S.base+S.stacksize; 
 9      S.stacksize  += STACKINCREMENT  //新的存储容量
10    }
11  *S.top++=e; 
12   return OK;
13  }

 

删除元素

 Status Pop (SqStack &S , SElemType &e )
 {     // 若栈空,返回ERROR
        if(S.top == S.base )   return ERROR; //若栈不空,删除栈顶元素,用e返回其值并返回OK   
         e=*--S.top;
         return OK;
 }

取栈顶元素

 Status GetTop(SqStack S , SElemType &e )
 {  //若栈空, 返回ERROR
       if( S.top ==S.base )   return ERROR; //若栈不空,则用e返回S的栈顶元素,并返回OK,
    e=*(S.top-1);
    return OK;
 }

3.2 队列

队列(queue )是一种先进先出(first in first out,简称FIFO表)的线性表。它只允许在表的一端进行插入元素,而在表的另一端进行删除元素。在队列中,允许插入的一端称为队尾(rear),允许删除的一端称为队头(front)。

 

类型定义

1  typedef struct QNode 
2    {QElemType       data;
3      struct QNode  *next;
4     }QNode, *QueuePtr;  //声明结点类型:QNode 
5  ​
6  typedef struct
7     { QueuePtr   front;     // 队头指针
8       QueuePtr   rear;       // 队尾指针
9     } LinkQueue;             //声明链队列类型名: LinkQueue

 

 

空的链队列的判决条件:头指针和尾指针均指向头结点

 

循环队列-顺序表示

假溢出

解决方法:循环队列

 

类型定义

1  #define MAXQSIZE  100       //最大队列长度
2  ​
3    typedef struct {
4      QElemType *base;  //指向初始化的动态分配存储空间
5      int front;                 //头指针, 若队列不空,指向队头
6      int  rear;             //尾指针, 若队列不空,指向队尾的下一个位置
7    } SqQueue;           //声明顺序队列类型名 SqQueue       
8  ​
9  SqQueue   Q ; //定义顺序队列变量 Q 

 

队空条件:front==rear

队满条件:(rear+1)%MAXQSIZE == front

如果不少用一个元素空间,则队列满的时候,front == rear 并不能确定队列状态(可空可满)

 

初始化

1  Status InitQueue ( SqQueue &Q ) 
2  {// 构造一个空队列Q
3      Q.base =(QElemType *) malloc(MAXQSIZE* sizeof(QElemType));
4      if (!Q.base) exit (OVERFLOW);    // 存储分配失败
5      Q.front = Q.rear = 0;
6       return OK;
7   }

队列长度

1  int  QueueLength( SqQueue Q )
2  {//返回队列Q的元素个数, 即队列的长度
3      return ( Q.rear-Q.front+MAXQSIZE )%MAXQSIZE;
4  }

插入元素

 Status EnQueue (SqQueue &Q, ElemType e) 
 {// 插入元素e为Q的新的队尾元素
  if ((Q.rear+1) % MAXQSIZE == Q.front )return ERROR; //队列满
     Q.base[Q.rear] = e;
     Q.rear = (Q.rear+1) % MAXQSIZE;
     return OK;
 }

删除元素

1   Status DeQueue (SqQueue &Q, ElemType &e) { 
2               // 若队列不空,则删除Q的队头元素,
3               // 用e返回其值,并返回OK;  否则返回ERROR
4      if (Q.front == Q.rear) return ERROR;
5      e = Q.base[Q.front];
6      Q.front = (Q.front+1) % MAXQSIZE;
7      return OK;
8  }

 

 

 

标签:return,队列,top,base,front,rear
From: https://www.cnblogs.com/eecsCodeStar/p/16981334.html

相关文章

  • redisson 延迟队列实现订单过期监听
    需求:     订单下单超过两个小时以后,如果还未支付,则自动转为取消支付状态实现:    1,创建延迟队列的监听任务RedisDelayedQueueListener,消费延迟队列 ......
  • P1160 队列安排
    P1160队列安排题目简述将N个同学依次插入队伍中,再删除m个同学,求最终的队伍顺序思路这题是个很好的练习链表的题目,要注意的是在链表的头和尾要搞一个Head和Tail指针,不......
  • Java数据结构之栈和队列
    原文链接:https://blog.csdn.net/fear_wolf/article/details/127459611文章目录一、栈(Stack)(一)概念(二)栈的使用(三)栈的模拟实现(四)问题思考1.栈,虚拟机栈,栈帧有什么区别?2.单链......
  • java 数组实现队列
     算法题用数组实现队列,三个函数,分别是添加add(),出队poll()和获取队中的元素个数getSize()当队的元素满的时候进行二倍的扩容。classmyqueue{privateint[]date;......
  • MSMQ微软消息队列的学习(先进先出)
    学习通过MSMQ发送简单类型的消息和复杂类型的消息看代码:namespaceMSMQ{classProgram{staticvoidMain(string[]args){conststrin......
  • 秒懂:JCTool 的 Mpsc 超高性能无锁队列 (史上最全+10W字长文)
    文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面......
  • 剑指offer 字符流中第一个不重复的字符(思维,队列)
    题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“g......
  • zookeeper和消息队列kafka
    一、Zookeeper是什么?1、Zookeeper服务集群的条件2、Zookeeper工作机制3、Zookeeper数据结构4、Zookeper特点5、Zookeeper选举机制6、Zookeeper应用场景二、Zookeepe......
  • 优先队列算法
    publicclassBinaryHeap<AnyTypeextendsComparable<?superAnyType>>{privatestaticfinalintDEFAULT_CAPACITY=10;privateintcurrentSize;privat......
  • IIS 之 连接数、并发连接数、最大并发工作线程数、队列长度、最大工作进程数
    http://t.zoukankan.com/l1pe1-p-7742936.html一、IIS连接数一般购买过虚拟主机的朋友都熟悉购买时,会限制IIS连接数,顾名思义即为IIS服务器可以同时容纳客户请求的最......