栈(Stack) 队列 (Queue)
题目:B3614
题目:B3616
直接调用 C++ STL函数库里面的 stack
和 queue
,分别代表栈和队列。
Stack
-
push : 将一个压入栈顶,形如
y.push(x)
-
pop :将一个元素弹出栈,当且仅当栈非空的情况下,形如
y.pop()
-
empty : 返回当前这个栈是否为空,形如
y.empty()
-
top : 返回栈顶元素(不弹出),当且仅当栈非空的情况下,形如
y.top()
-
size : 返回当前栈的元素数量,形如
y.size()
Queue
-
push : 将一个加入队列,形如
y.push(x)
-
pop :将一个元素弹出队列,当且仅当队列非空的情况下,形如
y.pop()
-
empty : 返回当前这个栈队列是否为空,形如
y.empty()
-
front : 返回队首元素(不弹出),当且仅当队列非空的情况下,形如
y.top()
-
size : 返回当前队列的元素数量,形如
y.size()
分别对应的代码如下:
#include <bits/stdc++.h>
#define ull unsigned long long
using namespace std;main() {cin.tie(0);ios::sync_with_stdio(false);ull t;cin >> t;while (t--) {ull n;cin >> n;stack<ull> st;while (n--) {string s;cin >> s;if (s == "push") {ull k;cin >> k;st.push(k);} else if (s == "pop") {if (st.empty())cout << "Empty\n";else {st.pop();}} else if (s == "query") {if (st.empty())cout << "Anguei!\n";else {cout << st.top() << endl;}} else if (s == "size") {cout << st.size() << endl;}}}return 0;
}
#include <bits/stdc++.h>
using namespace std;int main() {queue<int> q;int t;cin >> t;while (t--) {int n;cin >> n;if (n == 1) {int m;cin >> m;q.push(m);}if (n == 2) {if (q.empty())cout << "ERR_CANNOT_POP\n";elseq.pop();}if (n == 3) {if (q.empty())cout << "ERR_CANNOT_QUERY\n";elsecout << q.front() << "\n";}if (n == 4) {cout << q.size() << endl;}}return 0;
}
链表(List)
题目:B3631
与上两个不同,c++里面没有专门为链表设计STL,所以我们自己用struct
设计。
首先在定义的时候,先考虑我们应该设计什么变量。
第一,需要当前元素的值对吧。第二,需要下一个元素的位置(也就是地址)对吧。由此可得:
struct Node{int val;Node next;//这里使用Node来作属性,主要是因为我们需要的是地址//所以我们不能用其它属性,类似一个重复递归(bushi)。
};
现在根据题意设计函数:
-
链接函数:x的next相等于y的next,y的next等于y的值。
-
删除函数:直接向简单点,把我们需要删除元素的上一个元素的指向直接指向这个元素的下一个元素,即可完成删除,不需要对这个元素做其他的处理,这就是相较于数组,可以做到
O(1)
的好处。 -
添加函数:显而易见,直接在末尾函数的下一个就是我们需要的值。
由此可得代码:
#include <bits/stdc++.h>
using namespace std;struct Node {int value;Node *next;Node(int v) : value(v), next(NULL) {}
};Node *li[1000001] = {NULL};int main() {int q;cin >> q;li[1] = new Node(1);li[1]->next = NULL;while (q--) {int op;cin >> op;if (op == 1) {int x, y;cin >> x >> y;Node *xn = li[x];Node *yn = new Node(y);yn->next = xn->next;xn->next = yn;li[y] = yn;} else if (op == 2) {int x;cin >> x;Node *xn = li[x];cout << ((xn->next) ? xn->next->value : 0) << endl;} else if (op == 3) {int x;cin >> x;Node *xn = li[x];if (xn->next) {Node *yn = xn->next;xn->next = yn->next;li[yn->value] = NULL;delete yn;}}}return 0;
}