STL — 栈和队列

 

一,栈

1,stack 的常用函数

  stack<int>s  定义一个存放 int 类型的 栈

  s.push()    入栈一个元素

  s.pop()      出栈一个元素

  s.top()     取栈顶一个元素

  s.size()         查看元素个数

  s.empty()   若栈为空 返回 true, 否则 返回 false

  清空栈代码方法:

    ① while(!s.empty()) s.pop();   

    ② stack<int>q; s=q;                 用一个全新的栈赋值

    ③ stack<int>q;   swap(s,q);     交换一个新的栈

 

2,数组实现顺序栈

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef int any;       // 可修改数据类型
typedef struct Sqssack // 顺序栈
{
#define MaxSize 666
    any a[MaxSize];  // 数组模拟栈
    int pt;             // 栈顶指针
    Sqssack() {      // 初始化栈
        pt = -1;
    }

    void push(any e) {  // 入栈
        a[++pt] = e;
    }
    void pop() {        // 出栈
        pt--;
    }
    any top() {         // 取栈顶元素
        return a[pt];
    }
    bool empty() {       // 判断栈是否为空
        return pt == -1;
    }
    int size() {        // 返回栈的大小
        return pt + 1;
    }
}ss;
int main(void)
{
    ss s;
    for (int i = 1; i <= 5; i++)
        s.push(i);
    while (!s.empty())
    {
        any vertex = s.top();
        s.pop();
        printf("%d ", vertex);
    }puts("");

    system("pause");
    return 0;
}
View Code

 

 

二,队列

1,queue 的常用函数

  queue<int>q;

  q.push()   入队

  q.pop()  出队

  q.front()  取队首元素

  q.size()        查看元素个数

  q.empty()     若队列为空 返回 true, 否则 返回 false

  清空队列的方法:

    ① while(!s.empty()) s.pop();   

    ② queue<int>q;  s=q;                 用一个全新的队列赋值

    ③ queue<int>q;   swap(s,q);     交换一个新的队列

 

2,数组实现队列

① 顺序队列

  用 first:指向队首元素
  用 rear:指向队尾元素的下一个位置
  初始条件:first = rear = 0,此时队中没有元素且下标最小
  队满条件:rear == MaxSize - 1
  队空条件:first == rear
  元素个数:rear - first

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef int any;       // 可修改的数据类型
typedef struct SqQueue // 顺序队列
{
#define MaxSize 666
    any a[MaxSize];  // 数组模拟队列
    int first, rear; // 队首指针的前一位和队尾指针
    SqQueue() {      // 初始化队列
        first = rear = 0;
    }

    void push(any e) {
        a[rear++] = e;
    }
    void pop() {
        first++;
    }
    any front() {
        return a[first];
    }
    bool empty() {
        return first == rear;
    }
    int size() {
        return rear - first;
    }
}sq;
int main(void)
{
    sq q;
    for (int i = 1; i <= 5; i++)
        q.push(i);
    while (!q.empty())
    {
        any vertex = q.front();
        q.pop();
        printf("%d ", vertex);
    }puts("");

    system("pause");
    return 0;
}
View Code

② 环形队列

  用 first:指向队首元素
  用 rear:指向队尾元素的下一个位置
  但当将数组的前后相连后,队满和队空的条件就都变成了 first == rear。于是为了区分两者,环形队列少用一个空间,将队尾指针到达队首前一个空间认为是队满溢出,于是有
  初始条件:first = rear = 0,每当一个元素出队时,队头的位置都会变,所以可以随便将 first 和 rear 赋为 0~N-1 的任何值
  队满条件:(rear + 1) % MaxSize == first,真的队尾和真的队头之间只差一个空位
  队空条件:first == rear,真的队尾跑到真的队头的下一个位置
  元素个数:(rear + MaxSize - first) % MaxSize

#define _CRT_SECUR_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct SqQueue // 环形队列
{
#define MaxSize 666
    int data[MaxSize];
    int first, rear;
    SqQueue()   // 初始化队列
    {
        first = rear = 0;
    }
    void push(int e) // 进队列
    {
        data[rear] = e;
        rear = (rear + 1) % MaxSize;
    }
    int front() // 取队首元素
    {
        return data[first % MaxSize];
    }
    void pop() // 出队列
    {
        first = (first + 1) % MaxSize;
    }
    bool empty() {
        return first == rear;
    }
    int size() {
        return (rear + MaxSize - first) % MaxSize;
    }
}sq;
int main(void)
{
    sq q;
    for (int i = 1; i <= 5; i++)
        q.push(i);
    while (!q.empty())
    {
        int vertex = q.front();
        q.pop();
        printf("%d ", vertex);
    }puts("");

    system("pause");
    return 0;
}
View Code

 

 

 

========== ========= ======== ======== ======= ====== ==== === == =

      一剪梅  李清照 〔宋代〕

红藕香残玉簟秋。轻解罗裳,独上兰舟。云中谁寄锦书来?雁字回时,月满西楼。
花自飘零水自流。一种相思,两处闲愁。此情无计可消除,才下眉头,却上心头。

 

posted @ 2020-02-29 11:34  叫我妖道  阅读(250)  评论(0编辑  收藏  举报
~~加载中~~