欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

队列---简单实现杨辉三角求二项式的系数值

程序员文章站 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;
}