第三章学习小结
2019-03-31 21:03 shinyshiny 阅读(213) 评论(3) 编辑 收藏 举报在以上两周的数据结构的学习中,我学到了栈和队列两种特殊的线性表。
1.栈是限定仅在表尾进行插入或删除的线性表,又称为后进先出的线性表。栈有两种存储表示,顺序和链式。栈的主要操作是出栈和入栈,对于顺序栈的进栈和出栈操作要注意判断栈满或栈空。
2.队列是一种先进先出的线性表。他只允许在表的一段进行插入,而在表的另一端进行删除。它也有两种存储表示,顺序和链式。队列的主要操作是进队和出队,对于顺序的循环队列的进队出队操作要注意判断队满或队空。凡是涉及
队头和队尾指针的修改都要将其对MAXQSIZE求模。
3.栈有一个重要应用是在程序设计语言中实现递归。递归是陈旭涉及中最为重要的方法之一,递归程序结构清晰,形式简洁。但递归程序在执行时需要系统提供隐式的工作栈来保存调用过程中的参数,局部变量和返回地址,因此递归程序占用内存空间较多,
运行效率较低。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
设某银行有A、B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客。给定到达银行的顾客序列,请按业务完成的顺序输出顾客序列。假定不考虑顾客先后到达的时间间隔,并且当不同窗口同时处理完2个顾客时,A窗口顾客优先输出。
这是这章的实践作业,很明显,这需要用到队列来进行操作。
我的思路主要是先建立一个数组存放这些编号,然后用一个if语句来判断奇偶,将奇数放入第一个队列,偶数放入第二个队列,这样子来前面的工作就算完成了。
紧接着就是输出他们,而这个就有丶麻烦了。我的思路是用一个for循环来输出,判断 i 是否为三或三的倍数,因为题目要求的输出格式是两个奇数一个偶数如此循环,所以当i=3是则输出第二个队列中的元素。
但是,这个方法有一个未解决的地方就是b如果比a多,那么a输出完后,b就不会输出,所以我加了第三个判断条件,如果第一个队列为空,则一直输出第二个队列的元素,这样就把问题解决了。
解决这个问题花费时间不多,但是代码还未写好注释。
#include<iostream>
using namespace std;
#define MAXSIZE 1000
typedef struct QNode{
int data;
struct QNode *next;
} QNode, *Queueptr;
typedef struct {
Queueptr front;
Queueptr rear;
}LinkQueue;
int InitQueue(LinkQueue &Q)
{
Q.front = new QNode;
if(Q.front==NULL) exit(2);
Q.front->next = NULL;
Q.rear = Q.front;
return 1;
}
bool QueueEmpty(LinkQueue Q)
{
if(Q.front == Q.rear)
return false;//队空
else
return true;
}
int EnQueue(LinkQueue &Q, int e)
{
QNode *p;
p = new QNode;
if (p==NULL) exit( 2 );
p->data = e; p->next = NULL;
Q.rear->next = p;
Q.rear = p;
return 1;
}
int DeQueue(LinkQueue &Q, int &e)
{//调用该函数前先判断队列是否为空
QNode *p;
p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if(Q.rear == p) //最后一个结点出队
Q.rear = Q.front;
delete p; //回收p指向的空间
return e;
}
int main()
{
int n,x,a[MAXSIZE];
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
LinkQueue q1,q2;
InitQueue(q1);
InitQueue(q2);
for(int i=0;i<n;i++)
{
if(a[i]%2!=0)
EnQueue(q1,a[i]);
else EnQueue(q2,a[i]);
}
for(int i=1;i<=n;i++)
{
if(i%3!=0&&QueueEmpty(q1)!=0)
{
cout<<DeQueue(q1,x);
if(i!=n)
cout<<" ";
}
else if(i%3==0&&QueueEmpty(q2)!=0&&QueueEmpty(q1)!=0)
{
cout<<DeQueue(q2,x);
if(i!=n)
cout<<" ";
}
else if(QueueEmpty(q1)==0)
{
cout<<DeQueue(q2,x);
if(i!=n)
cout<<" ";
}
}
return 0;
}