zhzbd
zhzbd
采纳率40.9%
2021-03-04 22:44

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

10
已结题

由于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;}
  • 点赞
  • 收藏
  • 复制链接分享

2条回答

  • ProfSnail ProfSnail 1月前

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

    当队列满的时候就停止循环: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;
    }
    点赞 评论 复制链接分享
  • gzjimzhou Hello编程世界 1月前

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

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

    点赞 评论 复制链接分享