recover-quack-data-structure

本文介绍了一种针对特殊数据结构Quack的恢复算法,该算法可以将排序好的Quack中的元素无损地转移到数组中,并考虑了元素可能存在的重复情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.fgdsb.com/2015/01/06/recover-quack-data-structure/


给一个Quack的类,里面有三个方法:
pop(): 随机从头或者尾扔出一个元素;
peek(): 随机看头或者尾的一个元素,peek()之后pop()的话一定会pop()出peek()的那个元素;
push(): 向尾部插入一个元素

问题是:给一个排序好的Quack,怎么把里面的元素原封不动的放到一个Array里面。
Follow up:如果quack里面有重复的元素,怎么处理。


对于不重复元素的情况,用queue存小的数,stack存大的数,先pop()一个数,再peek一下,比较这两个数,如果pop的大,就代表肯定是quack的尾巴,反之肯定是头,然后插入queue或者stack就行了。这里假设quack有empty方法。

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
      
vector<int> recover_quack(quack& qk) {
queue<int> q;
stack<int> s;
while(!qk.empty()) {
int num1 = qk.pop();
if(qk.empty()) {
q.push(num1);
break;
}
int num2 = qk.peek();
if(num1 < num2) q.push(num1);
else s.push(num1);
}
vector<int> ret;
while(!q.empty()) {
ret.push_back(q.front());
q.pop();
}
while(!s.empty()) {
ret.push_back(s.top());
s.pop();
}
return ret;
}

对于有重复元素的情况,算法跟上面差不多,但是当遇到重复的时候,可以用一个hash_map记下来这个count,最后结算的时候补上去即可。

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
      
vector<int> recover_quack(quack& qk) {
queue<int> q;
stack<int> s;
unordered_map<int,int> rep;
while(!qk.empty()) {
int num1 = qk.pop();
if(qk.empty()) {
q.push(num1);
break;
}
int num2 = qk.peek();
if(num1 < num2) q.push(num1);
else if(num1 > num2) s.push(num1);
else {
++rep[num1];
}
}
vector<int> ret;
while(!q.empty()) {
int num = q.front();
ret.push_back(num);
int count = rep[num];
while(count-- > 0) ret.push_back(num);
rep[num] = 0;
q.pop();
}
while(!s.empty()) {
int num = s.top();
ret.push_back(num);
int count = rep[num];
while(count-- > 1) ret.push_back(num);
rep[num] = 0;
s.pop();
}
return ret;
}

参考的quack类,测试用

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
      
class quack {
public:
quack( const vector<int>& init) {
for( auto i : init) {
_data.push_back(i);
}
}
bool empty() {
return _data.empty();
}
int pop() {
int ret = 0;
int ran = _last_peek == - 1 ? rand() % 2 : _last_peek;
if(ran == 0) {
ret = _data.front();
_data.pop_front();
} else {
ret = _data.back();
_data.pop_back();
}
_last_peek = - 1;
return ret;
}
void push( int num) {
_data.push_back(num);
}
int peek() {
int ret = 0;
if(rand() % 2 == 0) {
ret = _data.front();
_last_peek = 0;
} else {
ret = _data.back();
_last_peek = 1;
}
return ret;
}
private:
deque<int> _data;
int _last_peek{ - 1 };
};

Check the original question at MITBBS


内容概要:本文详细探讨了基于MATLAB/SIMULINK的多载波无线通信系统仿真及性能分析,重点研究了以OFDM为代表的多载波技术。文章首先介绍了OFDM的基本原理和系统组成,随后通过仿真平台分析了不同调制方式的抗干扰性能、信道估计算法对系统性能的影响以及同步技术的实现与分析。文中提供了详细的MATLAB代码实现,涵盖OFDM系统的基本仿真、信道估计算法比较、同步算法实现和不同调制方式的性能比较。此外,还讨论了信道特征、OFDM关键技术、信道估计、同步技术和系统级仿真架构,并提出了未来的改进方向,如深度学习增强、混合波形设计和硬件加速方案。; 适合人群:具备无线通信基础知识,尤其是对OFDM技术有一定了解的研究人员和技术人员;从事无线通信系统设计与开发的工程师;高校通信工程专业的高年级本科生和研究生。; 使用场景及目标:①理解OFDM系统的工作原理及其在多径信道环境下的性能表现;②掌握MATLAB/SIMULINK在无线通信系统仿真中的应用;③评估不同调制方式、信道估计算法和同步算法的优劣;④为实际OFDM系统的设计和优化提供理论依据和技术支持。; 其他说明:本文不仅提供了详细的理论分析,还附带了大量的MATLAB代码示例,便于读者动手实践。建议读者在学习过程中结合代码进行调试和实验,以加深对OFDM技术的理解。此外,文中还涉及了一些最新的研究方向和技术趋势,如AI增强和毫米波通信,为读者提供了更广阔的视野。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值