Stack(栈)是一种后进先出的数据结构
使用STL的STACK需要的头文件
#include一个头文件
stack是基于deque实现的 相当于 deque双端队列 封闭了一端
&.1
stack< int > first ; // 构造一个存放int类型的空栈,size=0;
&.2
deque<int> mydeque (3,100); //构造一个包含3个int元素的双端队列
stack<int> second (mydeque); //用自己的双端队列构造一个栈(size=3)
&.3
stack<int,vector<int> > third; //指明用vector实现一个栈(存放int),空栈size=0
&.4
v
ector<int> myvector (2,200); //构造一个存放2个元素的vector
&.5
stack<int,vector<int> > fourth (myvector); //用自己的vector构造一个栈,size=2
push
mystack.push(i);
push函数将参数元素加入栈中,没有返回值(例如这里循环将0,1,2,3,4加入栈中,注意栈顶元素是4)
size
`mystack.size()`
size函数返回栈的大小(如果有5个元素,size=5)
empty
mystack.empty()
empty函数返回一个bool值,栈为空时返回true,否则返回false
top
mystack.top();
top函数的返回值是栈顶元素(注意并没有删掉栈顶元素
pop
mystack.pop();
pop函数将栈顶元素删掉,没有返回值
emplace
stack<Node> mystack;
mystack.emplace(1,2);
emplace函数可以将一个元素加入栈中,与push的区别在于:emplace可以直接传入Node的构造函数的参数,并将构造的元素加入栈中
mystack.push(1,2); //编译不通过,要达到上面的效果需要手动构造,例如mystack.push(Node(1,2));
Node p = mystack.top();
cout << p.a << " " << p.b << endl;
stack<Node> my2;
my2.swap(mystack); //swap函数可以交换两个栈的元素
pair是将2个数据组合成一组数据, pair的实现是一个结构体,主要的两个成员变量是first second 因为是使用struct不是class,所以可以直接使用pair的成员变量。。
头文件
#include
类模板:
template<class T1,class T2> struct pair
参数:T1是第一个值的数据类型,T2是第二个值的数据类型。
功能:pair将一对值(T1和T2)组合成一个值,
这一对值可以具有不同的数据类型(T1和T2),
两个值可以分别用pair的两个公有函数first和second访问。
pair p1; //创建一个空的pair对象(使用默认构造),它的两个元素分别是T1和T2类型,采用值初始化。
pair<T1, T2> p1(v1, v2); //创建一个pair对象,它的两个元素分别是T1和T2类型,其中first成员初始化为v1,second成员初始化为v2。
make_pair(v1, v2); // 以v1和v2的值创建一个新的pair对象,其元素类型分别是v1和v2的类型。
p1 < p2; // 两个pair对象间的小于运算,其定义遵循字典次序:如 p1.first < p2.first 或者 !(p2.first < p1.first) && (p1.second < p2.second) 则返回true。
p1 == p2; // 如果两个对象的first和second依次相等,则这两个对象相等;该运算使用元素的==操作符。
p1.first; // 返回对象p1中名为first的公有数据成员
p1.second; // 返回对象p1中名为second的公有数据成员
————————————————
创建pair
在创建pair对象时,必须提供两个类型名,两个对应的类型名的类型不必相同
pair<string, string> anon; // 创建一个空对象anon,两个元素类型都是string
pair<string, int> word_count; // 创建一个空对象 word_count, 两个元素类型分别是string和int类型
pair<string, vector<int> > line; // 创建一个空对象line,两个元素类型分别是string和vector类型
实例
设计一个简化版的推特(Twitter),可以让用户实现发送推文,关注/取消关注其他用户,能够看见关注人(包括自己)的最近十条推文。你的设计需要支持以下的几个功能:
postTweet(userId, tweetId): 创建一条新的推文
getNewsFeed(userId): 检索最近的十条推文。每个推文都必须是由此用户关注的人或者是用户自己发出的。推文必须按照时间顺序由最近的开始排序。
follow(followerId, followeeId): 关注一个用户
unfollow(followerId, followeeId): 取消关注一个用户
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/design-twitter
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Twitter {
private:
/*2个哈希表*/
unordered_map<int,set<int>> userId2follow;
unordered_map<int,stack<pair<int,int>>> userId2Tweet;
int counter;//计数器
public:
Twitter() {
counter=0;//计数器初始化
}
void postTweet(int userId, int tweetId) {
/*添加推特,记得counter++*/
userId2Tweet[userId].push({tweetId,counter++});
}
vector<int> getNewsFeed(int userId)
{
vector<int> res;
/*加入userId本身的推特栈*/
vector<stack<pair<int,int>>> tmp={userId2Tweet[userId]};
for(set<int>::iterator ite=userId2follow[userId].begin();ite!=userId2follow[userId].end();ite++)
{
/*注意用户关注其本身的操作!这里要将这种情况排除*/
if(*ite!=userId)
/*将userId所关注的其他用户的推特栈加入tmp*/
tmp.push_back(userId2Tweet[*ite]);
}
for(int i=0;i<10;i++)
{
/*记录最大值和索引*/
int maxindex,maxval=-1;
for(int j=0;j<tmp.size();j++)
{
if(!tmp[j].empty() && tmp[j].top().second>maxval)
{
maxval=tmp[j].top().second;//保存最大值
maxindex=j;//保存索引
}
}
if(maxval==-1) break;//所有栈都为空
res.push_back(tmp[maxindex].top().first);//将推特id加入res
tmp[maxindex].pop();
}
return res;
}
void follow(int followerId, int followeeId) {
userId2follow[followerId].insert(followeeId);//关注
}
void unfollow(int followerId, int followeeId) {
userId2follow[followerId].erase(followeeId);//取关
}
};