简单改了一下网上的一段代码有个问题不明白 就是我第一次点按钮51 insert queue2 len is:1
10 insert queue2 len is:2
95 insert queue2 len is:3
51 out queue2 len is:2
10 out queue2 len is:1
95 out queue2 len is:0当再次,点击按钮时,,,就报错了,,在入队时
//入队
public void In(object e)
{
if(IsFull())
{
//Console.WriteLine("队列已满!");
MessageBox.Show("q is full");
return;
}
data[++rear]=e;// 这句保持,数组溢出了
}
我不明白的是,,我初始化了队列大小为3,
加了3 元素后,出了3个元素,,应该大小还是3个呀,怎么就不给加了呢?外部生命
Queue2 q = new Queue2(3);
按钮里的代码:
int rdNum;
Random rd = new Random();
while (!q.IsFull())
{
//if (q.IsEmpty()) return;
rdNum = rd.Next(10, 100);
q.In(rdNum);
this.txGet.AppendText(rdNum.ToString()+"insert" + "queue2 len is:"+q.GetQueueLength()+ "\r\n"); } while (!q.IsEmpty())
{
this.txGet.AppendText(q.Out() + "out" + "queue2 len is:" + q.GetQueueLength() + "\r\n");
} 队列的类:class Queue2
{
object[] data; //数据元素
int maxsize; //最大容量
int front; //指向队头
int rear; //指向队尾
//初始化队列
public Queue2(int size)
{
this.maxsize = size;
data = new object[size];
front = rear = -1;
}
//最大容量属性
public int MaxSize
{
get
{
return this.maxsize;
}
set
{
this.maxsize = value;
}
}
//队尾属性
public int Rear
{
get
{
return this.rear;
}
}
//队头属性
public int Front
{
get
{
return this.front;
}
}
//数据属性
public object this[int index]
{
get
{
return data[index];
}
}
//获得队列的长度
public int GetQueueLength()
{
return rear-front;
}
//判断队列是否满
public bool IsFull()
{
if(GetQueueLength() == maxsize)
return true;
else
return false;
}
//判断队列是否为空
public bool IsEmpty()
{
if(rear==front)
return true;
else
return false;
}
//清空队列
public void ClearQueue()
{
rear = front = -1;
}
//入队
public void In(object e)
{
if(IsFull())
{
MessageBox.Show("队列已满!");
return;
}
data[++rear]=e;
}
//出队
public object Out()
{
if(IsEmpty())
{
MessageBox.Show("队列为空!");
return null;
}
if(rear-front>0)
{
object tmp = data[++front];
return tmp;
}
else
{
MessageBox.Show("全出队了!");
ClearQueue();
return null;
}
}
//获得队头元素
public object GetHead()
{
if(IsEmpty())
{
MessageBox.Show("队列为空!");
return null;
}
return data[front+1];
}
}}
解决方案 »
- DevExpress ChartControl导出图片(Excel)时滚动条以外的部分显示不出来,如何解决
- 急救~C#split问题
- C#怎样通过文件名获取文件路径
- c# 调用com??
- 天敏sdk3000C#二次开发!初始化时发生灾难性故障
- 在.Net中数组乱序排列的问题?
- 关于listview的幼稚问题!
- 100分求助!有人用C#做过SSL加密通信方面的东西吗?
- 随机不重复取得编号的问题
- 关于Treeview 怎样为节点添加鼠标右键单击的事件?
- string和DateTime转换问题
- C# 写web代理服务器慢,请教技术问题!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11
当全部出队,rear=front=3,队列为空时,你没有重置rear和front,导致还是rear=front=3.
当在点button时,你虽然有判断IsFull()
public bool IsFull()
{
if (GetQueueLength() == maxsize)0!=3 所以返回false
return true;
else
return false;
}
public int GetQueueLength()
{
return rear - front;//此时3-3=0
}
public void In(object e)
{
if (IsFull())//false
{
MessageBox.Show("队列已满!");
return;
}
data[++rear] = e;
}
主要原因是因为执行不到else,让队列清空,因为你外部 while (!q.IsEmpty()) rear=front时返回true,所以进不去else让rear和front重置。public object Out()
{
if (IsEmpty())
{
MessageBox.Show("队列为空!");
return null;
}
if (rear - front > 0)
{
object tmp = data[++front];
return tmp;
}
else
{
MessageBox.Show("全出队了!");
ClearQueue();
return null;
}
}
public bool IsEmpty()
{
if (rear == front)
{
ClearQueue();
return true;
}
else
return false;
}
多加个清空的就好了!