学习目标:
总复习数据结构:栈、队列
为备考划重点自用,不喜勿喷。
一、栈
1.栈是只允许在一端进行插入或删除操作的线性表。
二、队列
1.队列是只允许在表的一端进行插入,在另一端进行删除的线性表。
2.队列的顺序存储
typedef struct
{
elemtype data[maxsize];
int front,rear;
}Queue;
3.循环队列的操作
*需要注意的是:为了区分队空和队满的情况,牺牲一个单元来区分队空和队满,入队时少用一个队列单元,“以队头指针在队尾指针的下一位置作为队满的标志”,如下图d2所示。
队满条件:(Q.rear+1)%maxsize==Q.front;
队空条件:Q.front==Q.rear;
基本操作:
1)初始化
void initqueue(Queue &Q)
{
Q.rear=Q.front=0;
}
2)判队空
bool isempty(Queue Q)
{
if(Q.rear==Q.front)
return true;
else
return false;
}
3)入队
bool enqueue(Queue &Q,elemtype &x)
{
if(Q.front==(Q.rear+1)%maxsize)
return false;//队满,则不成功
Q.data[Q.rear]=x;
Q.rear=(Q.rear+1)%maxsize;//队尾指针加一取模
return ture;
}
4)出队
bool dequeue(Queue &Q,elemtype &x)
{
if(Q.front==Q.rear)
return false;//队空,则不成功
x=Q.data[Q.front];
Q.front=(Q.front+1)%maxsize;
return true;
}
4.队列的链式存储
typedef struct
{
elemtype data;
struct Linklist *next;
}Linklist;
typedef struct
{
Linklist *front,*rear;
}Linkqueue;
5.链队的初始化
void initqueue(Linkqueue &Q)
{
Linklist *L;//头结点
L=(Linklist *)malloc(sizeof(Linklist));
L->next=NULL;
Q->front=Q->rear=L;
}
三、习题
1.循环队列的引入是为了克服()。
【解答】假溢出
2.阅读算法,并回答下列问题:
(1)设队列Q=(1,3,5,2,4,6)。写出执行算法test后的队列Q;
(2)简述算法test的功能。
void test(Queue *Q)
{ DataType e;
if (!QueueEmpty(Q))
{ e=DeQueue(Q);
test(Q);
EnQueue(Q,e);
}
}
具体的执行过程可以看做:
call test_1(): 取出1
call test_2(): 取出3
call test_3(): 取出5
call test_4(): 取出2
call test_5(): 取出4
call test_6(): 取出6
call test_7(): Queue is empty, return
return to test_6(): 放入6
return to test_5(): 放入4
return to test_4(): 放入2
return to test_3(): 放入5
return to test_2(): 放入3
return to test_1(): 放入1
【解答】
1)Q=(6, 4, 2, 5, 3, 1)
2)算法test的功能是把队列倒序