zoukankan      html  css  js  c++  java
  • [导入]用循环队列输出杨辉三角形

    用循环队列输出杨辉三角形貌似有点小题大做,但主要是为了练习队列应用嘛。说实在这个小程序也让我调试了很长时间.

    用这个程序用户就可以自行输入想要的杨辉三角形的行数了。

    //YHTriangle.cpp
    //输出杨辉三角形
    //算法思想:首先在循环队列中存放第三行的 1,2,1和第四行的1.
    //若循环队列队头元素和队头第二个元素均为1,则从队头删除一个1,在队尾插入两个1.
    //若不然,将队对头元素和队头第二个元素相加,将和值插入到队尾,删除对头一个元素。
    //若想输出杨辉三角形n行,将循环队列长度设置成 n+2。
    //输出:前两行直接输出。定义了print函数控制后面每行输出的元素个数
    #include "Queue.h"
    #include "CycQueue.h"
    #include <iostream>
    using namespace std;

    //输出n个空格
    void print_space(int n);
    //n行杨辉三角形的输出格式
    void print(int k, int n);

    int main()
    {
        int n;
        cout << "Please enter the YangHui Triangle row number n:";
        cin >> n;

        CycQueue<int> YHTri(n+2);

        YHTri.push(1);
        YHTri.push(2);
        YHTri.push(1);
        YHTri.push(1);
       //输出前两行
        print(1,n);
        print(1,n);
        print(1,n);
        while( !YHTri.full())
        {
            int a,b;
            //若队头元素和队头第二个元素均为1
            if( (YHTri.top() == 1) && (YHTri.second() == 1))
            {
                a = YHTri.pop_top();
                YHTri.push(1);
                YHTri.push(1);
                print(a,n);
            }
            //若不然
            else
            {       
                a = YHTri.pop_top();
                b = YHTri.top();
                YHTri.push(a + b);
                print(a,n);           
            }
        }

        //输出循环队列中留存的元素
        while( !YHTri.empty())
        {
            print(YHTri.pop_top(),n);
        }

        system("pause");
        return 0;
    }

    void print_space(int n) //输出n个空格
    {
        while(n--) cout << " ";
    }

    int i = 1, j = 0;
    void print(int k, int n) //n行杨辉三角形的输出格式
    {
        if( i==1 ) print_space(n);
        if(j++ != i) ;
        else
        {
            cout << endl;
            print_space(n-i);
            ++i;
            j = 1;
        }
        cout << k <<" ";
    }

    //循环队列的模板类声明

    #ifndef CYCQUEUE_H
    #define CYCQUEUE_H

    #include <iostream>
    using namespace std;

    template<class T>
    class CycQueue:public Queue<T>
    {
    public:
        CycQueue(int maxsz = 100):len(maxsz)
        {
            elems = new T[maxsz];
            front = rear = 0;
        };
        ~CycQueue(){delete[] elems;    };

        void clear() {rear = front = 0;};
        int size()const
        bool full()const
        bool empty()const
        bool push(const T& item);
        bool pop();
        T top()const;
        T pop_top();
        T second()const;
    protected:
    private:
        int front;
        int rear;
        int len;
        T* elems;
    };

    #include "CycQueue.cpp"
    #endif

    循环队列主要注意不要忘记%len,不然就都是莫名错误啦!
    文章来源:http://liyuxia-life.spaces.live.com/Blog/cns!DA1B364675ACF35!271.entry



    幸运草 2009-04-10 10:12 发表评论
  • 相关阅读:
    Java 网络编程基本步骤
    database link远程链接数据库
    oracle函数应用
    Oracle中的正则表达式
    java利用jxl操作Excel
    用AXIS2发布WebService的方法
    Oracle CASE WHEN 用法介绍
    Oracle 取随机数
    oracle学习-存储过程返回一个值,和返回一个结果集
    十道海量数据处理面试题与十个方法大总结
  • 原文地址:https://www.cnblogs.com/liyuxia713/p/2540785.html
Copyright © 2011-2022 走看看