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; }
二,队列
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; }
② 环形队列
用 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; }
========== ========= ======== ======== ======= ====== ==== === == =
一剪梅 李清照 〔宋代〕
花自飘零水自流。一种相思,两处闲愁。此情无计可消除,才下眉头,却上心头。