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

队列

队列是另一种限定存取位置的线性表。它只允许在表的一端插入,在另一端删除。允许插入的一端叫做队尾,允许删除的一端叫做队头
这里写图片描述

利用数组建立队列

这里写图片描述
由上图对队列的描述来看,定长的数组很快就会溢出。
但是,这种“溢出”可能是假溢出,因为数组的前端可能还有空位置。为了能够充分的利用数组的存储空间,把数组的前端和和后端连接起来,形成一个环形的表,让队列成为一个循环队列。
循环队列:数组首尾相接,当队头指针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;
}

猜你喜欢

转载自blog.csdn.net/qq_37934101/article/details/80863313