2014的第三题看起来比前两个还容易得多,就主要写写前两个吧
1.
系统中有最近打开文件的记录,先用整数表示打开的文件名,且只显示最近3个打开的文件,输出文件序列。
输入:1 输出: 1
输入:2 输出:2,1
输入:3 输出:3,2,1
输入:4 输出:4,3,2
输入:1 输出:1,4,3 //由此行得出超过3个的文件被kill掉了,故需要重新打开
输入:4 输出:1,4,3 //未被kill则不改变顺序
输入:3 输出:1,4,3
数据结构使用链表
#include<iostream>
#include<vector>
#include<stack>
#include<map>
#include<list>
using namespace std;
int main()
{
int t;
list<int> li;
list<int>::iterator it;
bool exist;
while (cin >> t) { //ctrl+z to stop
exist = false;
for (it = li.begin(); it != li.end(); it++) { //检查是否存在
if (*it == t) {
exist = true;
break;
}
}
if (!exist) { //不存在时需要插入,但要先将超过三的部分删掉
if (li.size() >= 3) {
auto last = --li.end();
li.erase(last);//删除最后一个元素
}
li.insert(li.begin(), t); //头插法
}
for (it = li.begin(); it != li.end(); it++)
cout << *it << ' ';
cout << endl;
}
}
2.
系统中有最新打开文件的记录,先用整数表示打开的文件名,且只显示最近3个打开的文件,输出文件序列。
输入:1 输出:1
输入:2 输出:2,1
输入:3 输出:3,2,1
输入:4 输出:4,3,2
输入:1 输出:1,4,3
输入:4 输出:4,1,3 //显示了最新的顺序
输入:3 输出:3,4,1
仍然使用链表结构
#include<iostream>
#include<vector>
#include<stack>
#include<map>
#include<list>
using namespace std;
int main()
{
int t;
list<int> li;
list<int>::iterator it;
bool exist;
while (cin >> t) { //ctrl+z to stop
exist = false;
for (it = li.begin(); it != li.end(); it++) {
if (*it == t) {
exist = true;
break;
}
}
if (!exist) { //不存在时需要插入,但要先将超过三的部分删掉
if (li.size() >= 3) {
auto last = --li.end();
li.erase(last);//删除最后一个元素
}
li.insert(li.begin(), t); //头插法
}
else { //存在时先it指向的结点摘下,再头插
li.erase(it);
li.insert(li.begin(),t);
}
for (it = li.begin(); it != li.end(); it++)
cout << *it << ' ';
cout << endl;
}
}
3.
求广义表的深度(括号匹配)
输入:(c,((d,e),f),h)
输出:3
按理说括号匹配要用栈,但有点大才小用了。
依次读入字符,用一个全局变量指示深度,遇(
则++
,遇)
则--
,最后输出最大值即可。