队列---简单实现杨辉三角求二项式的系数值
程序员文章站
2022-03-12 23:11:17
...
队列
队列是另一种限定存取位置的线性表。它只允许在表的一端插入,在另一端删除。允许插入的一端叫做队尾,允许删除的一端叫做队头。
利用数组建立队列
由上图对队列的描述来看,定长的数组很快就会溢出。
但是,这种“溢出”可能是假溢出,因为数组的前端可能还有空位置。为了能够充分的利用数组的存储空间,把数组的前端和和后端连接起来,形成一个环形的表,让队列成为一个循环队列。
循环队列:数组首尾相接,当队头指针front和队尾指针rear进到maxSize-1后,再前进一个位置就自动到下标0位置。
- 队头指针进1:front = (front + 1) % maxSize;
- 队尾指针进1:rear = (rear + 1) % maxSize;
循环队列中最多存放maxSize-1个元素
链式队列:链式队列存储空间消耗大,适合数据元素变动较大的情况,而且不存在队列满而溢出的情况。
代码实现(循环队列)
#include<assert.h>
#include<iostream>
using namespace std;
template<class T>
class Queue
{
public:
Queue(int sz = 10);//构造函数
~Queue();//析构函数
bool push(const T& x);//入队列
bool pop(T& x);//出队列
int size();//计算队列长度
//判空
bool empty()
{
return (front == rear) ? true : false;
}
//判满
bool Full()
{
return((rear + 1) % maxsize == front) ? true : false;
}
bool getFront();//得到队头指针
private:
int rear, front;//尾指针和头指针
T * element;//数组指针
int maxsize;
};
//构造一个maxsize = 10的队列
template<class T>
Queue<T>::Queue(int sz = 10)
{
front = 0;
rear = 0;
maxsize = sz;
element = new T[maxsize];
assert(element != NULL);
}
//析构函数
template<class T>
Queue<T>::~Queue()
{
front = rear = 0;
return;
}
//入队列
template<class T>
bool Queue<T>::push(const T& x)
{
if (Full())
return false;
element[rear] = x;
rear = (rear + 1) % maxsize;
if (front == rear)
return false;
return true;
}
//出队列
template<class T>
bool Queue<T>::pop(T& x)
{
if (empty())
return false;
x = element[front];
front = (front + 1) % maxsize;
}
//计算队列长度
template<class T>
int Queue<T>::size()
{
if ((rear - font) > 0)
{
return rear - front;
}
else if ((rear - front) < 0)
{
return rear - front + maxsize;
}
else
return 0;
}
杨辉三角
将二项式(a + b)^ i展开,其系数构成杨辉三角形。
杨辉三角除第一行外,每一行的值是上一行相邻的两个数相加。
左右的边上都是 1 ,可以看做0 + 1:
代码实现:显示杨辉三角的某一行
#include<queue>
#include<iostream>
using namespace std;
void Yang(int n)
{
int count = n;//计数器
int L = 0, R = 0;//左右模拟的0值
int first = 1;//第一行的第一个数
int second = 1;//第一行的第二个数
int value = 0;//计算需要插入队列的值
queue<int> s;//s队列
s.push(first);
s.push(second);
while (count > 1)//循环插入队列
{
s.push(R); s.push(1);
while (s.front() != 0)
{
value = s.front();
s.pop();
value += s.front();
s.push(value);
}
s.pop();
count--;
}
/*s.pop();*/
for (int i = 0; i <= n; i++)//循环输出
{
cout << s.front() << " ";
s.pop();
}
}
int main()
{
Yang(5);
return 0;
}
上一篇: php如何删除指定路径下的文件
下一篇: php如何递归删除文件