在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;
}
啊这,逻辑有点混乱,改了我半小时
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;
}
先写伪代码,再针对伪代码写小函数,逐个验证通过后再组装。
你的67行那里x=element[front];是什么意思?
看你是要删除X,为什么是将element[]赋值给x?