队列

队列的ADT:

template <typename E> class Queue{
private:
	void operator =(const Queue&){}
    Queue(const Queue&){}
public:
    Queue() {}
	virtual void clear()=0;
	virtual void enqueue(const E&)=0;
	virtual E dequeue()=0;
	virtual const E& frontValue() const=0;
	virtual int length() const=0;    
};

1.顺序队列类的实现:

整个数组位置是一个顺时针增长的循环队列。

listArray是一个指向存放队列元素组的指针。为了区分空队列和满队列,数组大小实际要比队列允许的最长长度大1.成员size用来控制队列的循环(它是取模操作符的基数)。成员rear表示当前队尾元素的位置,而front表示当前队首元素的位置。

template <typename E> class AQueue:public Queue<E>{
private:
	int maxSize;
	int front;
	int rear;
	E *listArray;
public:
	AQueue(int size=defaultSize){
		maxSize=size+1;
		rear=0;
		front=1;
		listArray=new E[maxSize]; 
	}
	~AQueue(){
		delete [] listArray; 
	}
	
	void clear(){
		rear=0;
		front=1;
	}
	
	void enqueue(const E& it){
		Assert(((rear+2)%maxSize)!=front,"Queue is full");
		rear=(rear+1)%maxSize;
		listArray[rear]=it;
	}
	
	E dequeue(){
		Assert(length()!=0,"Queue is empty");
		E it=listArray[front];
		front=(front+1)%maxSize;
		return it;
	}
	
	const E& frontValue() const {
	    Assert(length()!=0,"Queue is empty");
	    E it=listArray[front];
	}
	
	virtual int length() const {
	    return ((rear+maxSize)-front+1)%maxSize;
	}
};


2.链式队列类的实现:

成员front和rear分别是指向队首元素和队尾元素的指针。为了简化实现方法,可以使用一个头结点。在初始化时,front和rear同时指向头结点,之后front总是指向头结点,而rear指向队列的尾结点。enqueue只是简单的把新元素放到链表尾部(rear指向的结点),然后修改rear指针指向新的链表结点。dequeue只是简单的删除队列中的第一个结点,并修改front指针。

template <typename E> class LQueue:public Queue<E>{
private:
    Link<E>* front;
    Link<E>* rear;
    int size;
public:
	LQueue(int sz=defaultSize){
		front=rear=new Link<E>(); 
		size=0;
	}
	
	~LQueue() {
		clear(); delete front; 
	}
	
	void clear(){
		while(front->next!=NULL){
			rear=front;
			delete rear;
		}
		rear=front;
		size=0;
	}
	
	void enqueue(const E& it){
		rear->next=new Link<E>(it,NULL);
		rear=rear->next;
		size++;
	}
	
	void dequeue(){
		Assert(size!=0,"Queue is empty");
		E it=front->next->element;
		Link<E>* ltemp=front->next;
		front->next=ltemp->next;
		if(rear==ltemp)
		   rear=front;
		delete ltemp;
		size--;
		return it;
	}
	
	const E& frontValue() const {
	    Assert(size!=0,"Queue is empty");
	    return front->next->element;
	}
	
	virtual int length() const { return size;}
};
 

3.顺序队列与链式队列的对比:

实现顺序队列和链式队列的所有函数成员都需要常数时间。空间比较问题与栈类似。只是顺序队列不像顺序栈那样,它不能在一个数组里存储两个队列,除非总有数据项从一个队列转入另一个队列。

极化码(Polar Code)是由土耳其科学家Erdal Arıkan在2009年提出的一种新型纠错编码技术。它通过利用信道的极化现象,将虚拟信道分为误码率接近0和接近1/2的两类。在编码设计中,数据被放置在误码率极低的信道上,从而实现高效的数据传输。极化码的主要优势在于其理论编码容量能够达到香农限,并且构造方法较为简单。 MATLAB是一种功能强大的数学计算和编程工具,广泛应用于科学研究和工程领域。在极化码的研究中,MATLAB可用于构建编码和解码算法,模拟数据在不同信道条件下的传输效果,验证理论性能,并优化相关参数。 SC(Successive Cancellation,逐位取消)译码是极化码的基本解码方法。它从最可靠的比特开始,依次解码每个虚拟信道,且每个比特的解码结果会影响后续比特的解码,因为它们之间存在依赖关系。虽然SC译码的实现较为简单,但其计算复杂度较高,随着码长的增加,解码时间会线性增长。 SCL(Successive Cancellation List,逐位取消列表)译码是SC译码的改进版本。它通过引入列表机制,同时处理多个路径,从而增强了错误校正能力,并在一定程度上降低了错误率。与SC译码相比,SCL译码虽然需要消耗更多的计算资源,但能够提供更好的性能。 一个完整的MATLAB仿真资源通常包含以下内容: 编码模块:用于实现极化码的生成,包括码字构造和极化矩阵操作等。 信道模型:用于模拟各种通信信道,例如AWGN(加性高斯白噪声)信道或衰落信道。 SC/SCL译码模块:包含SC译码和SCL译码的算法实现。 误码率(BER)计算:通过比较发送和接收的码字,计算误码率,以评估编码性能。 性能曲线绘制:绘制误码率与信噪比(SNR)之间的关系曲线,展示不同译码策略的性能差异。 使用说明:指导用户如何运行仿真,理解代码结构,以及如何调整参数以进行自定义实验。 代码注
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值