栈和队列算法总结
知识概览
在数据结构中,栈和队列都属于线性表。栈是先进后出(FILO)的,队列是先进先出(FIFO)的。
代码模板
#include <iostream> using namespace std; const int N = 100010; // ********************** 栈 int stk[N], tt; // 插入 stk[++tt] = x; // 弹出 tt--; // 判断栈是否为空 if (tt > 0) not empty else empty // 栈顶 stk[tt]; // ********************** 队列 // 在队尾插入元素,在对头弹出元素 int q[N], hh, tt = -1; // 插入 q[++tt] = x; // 弹出 hh++; // 判断队列是否为空 if (hh <= tt) not empty else empty // 取出队头元素 q[hh];
栈
题目链接
https://www.acwing.com/problem/content/830/
代码(数组模拟)
#include <iostream> using namespace std; const int N = 100010; int stk[N], tt; int main() { int m; cin >> m; while (m--) { int x; string op; cin >> op; if (op == "push") { cin >> x; stk[++tt] = x; } else if (op == "pop") { tt--; } else if (op == "empty") { if (tt > 0) cout << "NO" << endl; else cout << "YES" << endl; } else if (op == "query") { cout << stk[tt] << endl; } } return 0; }
代码(STL)
#include <iostream> #include <stack> using namespace std; stack<int> stk; int main() { int m; cin >> m; while (m--) { int x; string op; cin >> op; if (op == "push") { cin >> x; stk.push(x); } else if (op == "pop") { stk.pop(); } else if (op == "empty") { if (stk.empty()) cout << "YES" << endl; else cout << "NO" << endl; } else if (op == "query") { cout << stk.top() << endl; } } return 0; }
队列
题目链接
https://www.acwing.com/problem/content/831/
代码(数组模拟)
#include <iostream> using namespace std; const int N = 100010; int q[N], hh, tt = -1; int main() { int m; cin >> m; while (m--) { int x; string op; cin >> op; if (op == "push") { cin >> x; q[++tt] = x; } else if (op == "pop") { hh++; } else if (op == "empty") { if (hh <= tt) cout << "NO" << endl; else cout << "YES" << endl; } else if (op == "query") { cout << q[hh] << endl; } } return 0; }
代码(STL)
#include <iostream> #include <queue> using namespace std; queue<int> q; int main() { int m; cin >> m; while (m--) { int x; string op; cin >> op; if (op == "push") { cin >> x; q.push(x); } else if (op == "pop") { q.pop(); } else if (op == "empty") { if (!q.empty()) cout << "NO" << endl; else cout << "YES" << endl; } else if (op == "query") { cout << q.front() << endl; } } return 0; }