无限生成,应该怎么修改代码?

由于y不断变化,导致无限生成,在不改判断满的语句的情况下,如何修改?


//LinearList.h
#include<iostream>
using namespace std;
template<class T>
class LinearQueue
{
public:
	LinearQueue(int LQMaxSize);
	~LinearQueue();
	bool IsEmpty();
	bool IsFull();
	bool Insert(T x);
	bool Delete(T& x);
	bool GetElement(T &x);

private:
	int front,rear;
	T*element;
    int Maxsize;
};

template<class T>
LinearQueue<T>::LinearQueue(int LQMaxSize)
{ Maxsize=LQMaxSize;
  element=new T[Maxsize];
  front=0;
  rear=0;}

template<class T>
LinearQueue<T>::~LinearQueue()
{ delete []element;}

template<class T>
bool LinearQueue<T>::IsEmpty()
{ if(front==rear)
     return true;
else return false;}

template<class T>
bool LinearQueue<T>::IsFull()
{
  if((rear+1)%Maxsize==front)
	  return true;
  else
	  return false;}

template<class T>
bool LinearQueue<T>::Insert(T x)
{ if(IsFull())
  {cout<<"此栈已满,无法添加"<<endl;
return false;}
else
{ element[rear]=x;
  rear=(rear+1)%(Maxsize);
 return true;}
}

template<class T>
bool LinearQueue<T>::Delete(T& x)
{ if(IsEmpty())
{cout<<"此栈是空"<<endl;
return false;}
else
{ x=element[front];
  front=(front+1)%(Maxsize);
return true;}}

template<class T>
bool LinearQueue<T>::GetElement(T &x)
{ if(IsEmpty())
   return false;
else
{
	x=element[front];
	
	return true;}
}

// 13.3.3.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include"LinearList.h"
#include<iostream>
using namespace std;
void YangHui(int n);
void PrintSpace(int n,int k)
{ for(int i=1;i<=n-k;i++)
   cout<<' ';
}
int main()
{   int n;
   cout<<"请输入杨辉三角的行数"<<endl;
   cin>>n;
   YangHui(n);
   system("pause");
	return 0;
}

void YangHui(int n)
{ 
	LinearQueue<int>Q(n+2);
	int x,y;
	PrintSpace(n,1);
	cout<<'1'<<endl;
	Q.Insert(0);
	Q.Insert(1);
	Q.Insert(1);
	for(int i=2;i<=n;i++)
	{  Q.Insert(0);
	PrintSpace(n,i);
	   do
	   {Q.Delete(x);
	   Q.GetElement(y);
	   if(y)
		   cout<<y<<' ';
	   else
		   cout<<endl;
	   Q.Insert(x+y);}
	   while(y);}
	cout<<endl;}

 

将队列大小放大到足够大就可以了。比如:LinearQueue<int>Q(n+3);

代码中的实现依赖y=0来结束循环,但是如果队列满了,0结束标记就无法加入到队列中,于是就陷入了死循环。

主函数对应的文件改成这样。

当队列满的时候就停止循环:break。 


// 13.3.3.cpp : 定义控制台应用程序的入口点。
//
#include"LinearList.h"
#include<iostream>
using namespace std;
void YangHui(int n);
void PrintSpace(int n, int k)
{
	for (int i = 1; i <= n - k; i++)
		cout << ' ';
}
int main()
{
	int n;
	cout << "请输入杨辉三角的行数" << endl;
	cin >> n;
	YangHui(n);
	system("pause");
	return 0;
}

void YangHui(int n)
{
	LinearQueue<int>Q(n + 2);
	int x, y;
	PrintSpace(n, 1);
	cout << '1' << endl;
	Q.Insert(0);
	Q.Insert(1);
	Q.Insert(1);
	for (int i = 2; i <= n; i++)
	{
		Q.Insert(0);
		PrintSpace(n, i);
		do
		{
			Q.Delete(x);
			Q.GetElement(y);
			if (y)
				cout << y << ' ';
			else
				cout << endl;
			if (Q.Insert(x + y)==0) {
				break;
			}
		} while (y);
		if (Q.IsFull()) {
			break;
		}
	}
	cout << endl;
}