zhzbd
zhzbd
采纳率40.9%
2021-02-24 22:30

一个简单问题:为什么代码总是走return false那条的路?应该怎么修改?

已采纳

 在void YangHui函数中,调用Delete和GetElement以及Insert似乎都不太成功,走return false的路。为什么?应该怎么修改?

//LinearQueue.h
#include"stdafx.h"
#include<iostream>
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 size;
	int front,rear;
	T*element;
		int Maxsize;};

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

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

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

template<class T>
bool LinearQueue<T>::IsFull()
{ size--;
  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);
  size++;
 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);
  size--;
return true;}}

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


//13.3.cpp
#include "stdafx.h"
#include"LinearQueue.h"
#include<iostream>
using namespace std;
void PrintSpace(int n,int k)
{  for(int i=1;i<=n-k;i++)
cout<<' ';}
void YangHui(int n)
{ LinearQueue<int>Q(n+2);
  int x=0,y=0;
  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;}
int main()
{  int n=0;
cout<<"请输入要显示的杨辉三角的行数:"<<endl;
cin>>n;
YangHui(n);
	return 0;
}
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

3条回答

  • weixin_42910064 泡视界 2月前

    啊这,逻辑有点混乱,改了我半小时

    1.你的 IsFull() 函数有错, 判断栈满没满,就判断就行了,为啥要改变size呢?

    2.你的Delete() 和 GetElement() 没有用指针,则 y 的值永远不会改变。

    以下贴出需要修改的地方,没贴的保持原样就行:

    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 size;
    	int front, rear;
    	T* element;
    	int Maxsize;
    };
    
    bool LinearQueue<T>::IsFull()
    {
    	//size--;                                //改这里,不要在判断栈满的时候修改size,没逻辑
    	//if ((rear + 1) % Maxsize == front)    //改这里,判断栈满的条件没逻辑
    	if((size -1) == Maxsize)                //改这里,改为此逻辑
    		return true;
    	else
    		return false;
    }
    
    template<class T>
    bool LinearQueue<T>::Delete(T* x)            //改这里,传递指针
    {
    	if (IsEmpty())
    	{
    		cout << "此栈是空" << endl;
    		return false;
    	}
    	else
    	{
    		*x = element[front];        //改这里,用指针获取数据,但其实这里你获取了也没有其他操作,所以Delete传参我认为没有意义
    		front = (front + 1) % (Maxsize);
    		size--;
    		return true;
    	}
    }
    
    
    template<class T>
    bool LinearQueue<T>::GetElement(T* x)        //改这里,传递指针
    {
    	if (IsEmpty())
    	{
    		cout << "此栈是空" << endl;
    		return false;
    	}
    	else
    	{
    		*x = element[front];        //改这里,用指针获取数据,这样y才能改变
    		return true;
    	}
    }
    
    void YangHui(int n)
    {
    	LinearQueue<int>Q(n + 2);
    	int x = 0, y = 0;
    	int* px = &x;                        //改这里,用指针
    	int* py = &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(px);        //改这里,传递指针,实际没有操作,没有意义
    			Q.GetElement(py);    //改这里,传递指针,这样y的值才能被获取到
    			if (y)
    				cout << y << ' ';
    			else cout << endl;
    			Q.Insert(x + y);
    		}
    		while (y);
    	}
    	cout << endl;
    }
    点赞 1 评论 复制链接分享
  • qq_34124780 qq_34124780 2月前

    你的67行那里x=element[front];是什么意思?

    看你是要删除X,为什么是将element[]赋值给x?

    点赞 评论 复制链接分享
  • huanhuilong 幻灰龙 2月前

    先写伪代码,再针对伪代码写小函数,逐个验证通过后再组装。

    点赞 评论 复制链接分享

为你推荐