Upload
dimitris-psounis
View
696
Download
1
Embed Size (px)
Citation preview
����� �������� � C
�� ��� 3:
����
�������� ������
����������� �� �������. ������
1. ��
1. ���� �� ���
2. ������� ������
2. ���� �� � ������
1. �����
2. ��������� �� C: ��������
3. ��������� �� C: ������������
4. ��������� �� C: ��!��� – "���
�� ��� �� #� ��
5. ��������� �� C: ����$���
%#������
6. ��������� �� C: ��� �����
%#������
7. ��������� �� C: ���&��! �
����������� �������������� � ����������������
3. "����� ��
1. �����
2. ��������� �� C: ��������
3. ��������� �� C: ������������
4. ��������� �� C: ��!��� – "���
��
5. ��������� �� C: ��!��� – �� #�
��
6. ��������� �� C: ����$���
%#������
7. ��������� �� C: ��� �����
%#������
8. ��������� �� C: ���&��! �
�. ��������
A. �����1. ����1. ������ �����
����������� �������������� � ����������������
� «��» ����� ��� ���� �������� �� �������� ����� � ��� �!���:
• � !�� ��� (enqueue) ���� ��������, ������� �� ��"�� ��� �����
• � �!�������� (dequeue) ���� ��������, ������� ��� ���� ��� �����
enqueue(2)
2
����������:
• � ���� �� !�"��#� �� ������ ���� ���!�$��!
%�������� &�������:
• '� !�#�� ������� !�� !���� ��� ��� ���� ����� �� !�#�� !�� � � �� �� (First In – First
Out: FIFO)
enqueue(4)
2 4
4
dequeue( )enqueue(5)
4
enqueue(3)
4 5
5
3
A. �����1. ����2. (����� ��� ���
����������� �������������� � ����������������
�� '������ ������ � ��� ���� �����:
• ������������ ��� ����� (init)
• ����$��� ���� �������� ��� ���� (enqueue)
• ��� ����� ���� �������� �!� �� ���� (dequeue)
• ��!��� �� � ���� ����� ���� (empty)
• ��!��� �� � ���� ����� ������ (full)
)!������ ����� �"�!������:
• �� ������ !����� (������� �� ���)
• *!"� ���� (�� !�����)
• +��"��� ����
• �� �!"� ���������� "��� (�!����� �� ���)
A. �����2. *!"� ���� �� ������1. ,�����
����������� �������������� � ����������������
%��� !�#�� �"�!���� (���� ��) � ������!�������:
• -��� ������ !����� N ��� ��� �� �!� �������� �� ������� ��� �����
• ��� ������� ����."��� (finish) !�� � ������� �� ��"�� ��� �����
• (,�������� ��� � ���� ��� ����� � ����� �� 0)
/"#� C
a[0]
…
a[1] a[2] a[2] a[N-1]
finish=2
4 5 34 5 3
����
A. �����2. *!"� ���� �� ������2. )"�!���� � C: ��"#���
����������� �������������� � ����������������
�� &������� � C ����� �� ���"�� ��:
• � ���� ����� ��� ���� (struct) �� �� � �� �������:
• -��� ������� �� QUEUE_SIZE �������
• ��� ������� ����."��� (finish) !�� ������� �� ��"�� ��� ����� �� ����:
• *!� 0…QUEUE_SIZE-1 �� � ���� ���� ���"������ ��� �������
• -1 �� � ���� ����� �����.
#define QUEUE_SIZE 10 /* Megethos pinaka ouras */
typedef int elem; /* typos dedomenwn ouras */
struct queue{
elem array[QUEUE_SIZE]; /* pinakas stoixeiwn */
int finish; /* telos tis ouras */
};
typedef struct queue QUEUE; /* Sinwnimo tis ouras */
…
finish=2
2 6 4
*��!������:0 1 2 3 QUEUE_SIZE-1
array
A. �����2. *!"� ���� �� ������3. )"�!���� � C: *�����!���� �����
���������� �������������� � ����������������
� ������!���� ������� ������� �� ��"�� ��� ����� �� �� -1
/* QU_init(): arxikopoiei tin oura */
void QU_init(QUEUE *q)
{
q->finish=-1;
}
…
finish=??
�0&1:
0 1 2 3 QUEUE_SIZE-1
array
…
finish=-1
0 1 2 3 QUEUE_SIZE-1
array
�,'*:
������:
• ����� !����� ������� ��� ���� ��� ����� � !��!�� �� ��"���� ��� 2��� ����� ��
�������!
A. �����2. *!"� ���� �� ������4. )"�!���� � C: -"����� – +��� ���� ��� /����� ����
!���������� �������������� � ����������������
� ���!��� �� � ���� ����� ���� (��������� !� #�), ������� ."�!����� �� � ����."��� finish����� �� �� -1 (��������� N-1)
/* QU_empty(): epistrefei TRUE/FALSE
* analoga me to an i oura einai adeia */
int QU_empty(QUEUE q)
{
return q.finish==-1;
}
/* QU_full(): epistrefei TRUE/FALSE
* analoga me to an i oura einai gemati */
int QU_full(QUEUE q)
{
return q.finish==QUEUE_SIZE-1;
}
5
A. �����2. *!"� ���� �� ������5. )"�!���� � C: ��� ��� %��������
"���������� �������������� � ����������������
� ����$��� ��� ���� ������� !�� #���� �� ������� �� �� finish+1 (�2��� ����� ���
����)
/* QU_enqueue(): Eisagei to x stin oura q
* epistrefei TRUE: se periptwsi epitixias
* FALSE: se periptwsi apotixias */
int QU_enqueue(QUEUE *q,elem x)
{
if (QU_full(*q))
return FALSE;
else
{
q->finish++;
q->array[q->finish]=x;
return TRUE;
}
}
…
finish=2
2 6 4
0 1 2 3 QUEUE_SIZE-1
array
�0&1: �,'* (!.�. !�� ��� ��� «5»):
…
finish=3
2 6 4
0 1 2 3 QEUEUE_SIZE-1
array
A. �����2. *!"� ���� �� ������6. )"�!���� � C: *!�������� %��������
#$���������� �������������� � ����������������
� ��� ����� (��� !�#���) �������� ��� ����� ������� � � ��:
1. *!� �������� �� ������� !�� ����� ��� ���� ��� ����� (��� �� �!����2��)
2. ������������� �� �!�"��!� ������� ���� ��� �� �������
3. ���� #����� �� finish (���#����� ���� 1)
…
finish=2
2 6 4
0 1 2 3 QUEUE_SIZE-1
array
�0&1:
�,'*:
…6 4
0 1 2 3 QUEUE_SIZE-1
array
finish=1
*x=2
A. �����2. *!"� ���� �� ������6. )"�!���� � C: *!�������� %��������
##���������� �������������� � ����������������
/* QU_dequeue(): Kanei apomakrinsi tou prwtou stoixeiou tis ouras
* epistrefei TRUE: se periptwsi epitixias
* FALSE: se periptwsi apotixias */
int QU_dequeue(QUEUE *q,elem *x)
{
int i;
if (QU_empty(*q))
return FALSE;
else
{
/* 1. Apothikeysi tou stoixeiou pou eksagetai*/
*x=q->array[0];
/* 2. Aristeri metakinisi twn stoixeiwn kata mia thesi */
for (i=0; i<q->finish; i++)
q->array[i]=q->array[i+1];
/* 3. To finish meiwnetai kata 1 */
q->finish--;
return TRUE;
}
}
A. �����2. *!"� ���� �� ������7. )"�!���� � C: ����������
#����������� �������������� � ����������������
� �����"����� ��� ����"��� �� project queue.dev �� �!���:
� '� queue.h ���� �� !�����!� �� �������� ��� ��� ��"� ��� �����
� '� queue.c ���� �� #���� �� ��������
� '� main.c ���� ��� !�������� !�� �!��������� ��� ���� ���� ����� �������.
� «��� ��» �� �� !�������� #�� �� ����� !"��� ��������� � "��������� ��� �����.
)!�� ����:
• '� !���� ���� !����������� � �!������� ������ ��"��� ��� �� «/"#� C – �� ��� 14:
,�.�"��� ����."��#�»
A. �����3. +��"��� ����1. � ������ ��� ��� +��"��� ����
#����������� �������������� � ����������������
� � !�� � ��� �!��������� �!����� ��� ��������� �� ������� ��� ����� ���� ��� ��
�������, �� �!��� �������� �� �!�������.
� �!������ �� �!�������� .�"��� �� ����� �� .�"���� �""� ��� ����."��� !�� �� �������
��� ���� ��� ����� ��� �� ������ � ���� ��� ����� ����� ��� ��� ����."���� (���� ��
������� ��������� �� ������� ��� �����). /�� !���������:
enqueue(2)
2
enqueue(4)
2 4
4
dequeue( )
enqueue(5)
4
enqueue(3)
4 5
5
3
start=0finish=0
start=0 finish=1
start=1finish=1
start=1 finish=2
start=1 finish=3
start=-1finish=-1
A. �����3. +��"��� ����1. � ������ ��� ��� +��"��� ����
#����������� �������������� � ����������������
� /�� �� �!������ �� (���) !��."���, ��� ��!��� ����� � 2������ �� ��"�� ��� !�����
(�!��� ��� ��� � �!������ �� �������� ��� ��� ������� ��� !�����)
� ,������� � ������ ��� ���"���� �����!
� 3!�� !"��� ���� 2������ �� ��"�� ��� !����� �� ���� ������� � �������� ���
���� ��� !�����
� ��"��� ."�!���� ��� !����� � ���"� (�!�� � �!����� �� ��� 1-1 ����� � 0)
4 5 3start=1 finish=3
0 1 2 3
array
4 5 6 7
0
array
1
2
345
67 start=1
finish=3
2 61start=6finish=0
0 1 2 3
array
4 5 6 7
0
array
1
2
345
67start=6
finish=1
4
5
3
26 1
A. �����3. +��"��� ����2. )"�!���� � C: ��"#���
#����������� �������������� � ����������������
�� &������� � C ����� �� ���"�� ��:
• � ���� ����� ��� ���� (struct) �� �� � �� �������:
• -��� ������� �� QUEUE_SIZE �������
• ��� �������� ����."���� (start ��� finish) !�� �������� ��������� ��� ���� ��� �� ��"�� ��� ����� ��
����� (�� start=finish=-1 �� � ���� ����� �����).
#define QUEUE_SIZE 10 /* Megethos pinaka ouras */
typedef int elem; /* typos dedomenwn ouras */
struct queue{
elem array[QUEUE_SIZE]; /* pinakas stoixeiwn */
int start; /* arxi tis ouras */
int finish; /* telos tis ouras */
};
typedef struct queue QUEUE; /* Sinwnimo tis ouras */
*��!������: 0
array1
2
345
67 start=1
finish=3
4
5
3
A. �����3. +��"��� ����3. )"�!���� � C: *�����!���� �����
#����������� �������������� � ����������������
� ������!���� ������� ������� ��� ���� ��� �� ��"�� ��� ����� �� �� -1
/* QU_init(): arxikopoiei tin oura */
void QU_init(QUEUE *q)
{
q->start =-1;
q->finish=-1;
}
�0&1: �,'*:
0
array
1
2
345
67
QUEUE_SIZE=8
start=??
finish=??
0
array
1
2
345
67
QUEUE_SIZE=8
start=-1
finish=-1
A. �����3. +��"��� ����4. )"�!���� � C: -"����� – +��� ����
# ���������� �������������� � ����������������
� ���!��� �� � ���� ����� ���� ������� ."�!����� �� � ����."��� start (��� � ����."���
finish) ����� �� �� -1
• *���� �� �"�� ���� �� ��� �!� ��� ��� (�2�� ��������� ��� � �"�!���� �� .���#� !�� ��
����� �� � ��� ����� !�� ������!���� ��� ���� ��� ���� !��.�� ��� �"�!����)
/* QU_empty(): epistrefei TRUE/FALSE
* analoga me to an i oura einai adeia */
int QU_empty(QUEUE q)
{
return q.finish==-1;
}
A. �����3. +��"��� ����5. )"�!���� � C: -"����� – /����� ����
#!���������� �������������� � ����������������
� ���!��� �� � ���� ����� !� #� ������� ."�!����� �� � ����."��� finish ���� ���� 1 "��������!� �� ����."��� start (��"��� start==finish+1)
• ���� ��� !���!�� !�� finish=QUEUE_SIZE-1 ���� !��!�� �� �"�� ���� �� start==0
*��� �!���� �� ����� �� ��� !������ ���4� �#����:
/* QU_full(): epistrefei TRUE/FALSE
* analoga me to an i oura einai gemati */
int QU_full(QUEUE q)
{
return q.start==(q.finish+1)%QUEUE_SIZE;
}
)!�� ����:
• � ��"���� % �!����2�� �� �!�"��!� ��� �������� ��� ��� �#� (/"#� C – �� ��� 4).
• ,�# ��� ������!������ #�� �� ��� ����"� �� !����!��� �� start ���� �� �� ��� �!�����
��, ���� �� �� 0.
A. �����3. +��"��� ����6. )"�!���� � C: ��� ��� %��������
#"���������� �������������� � ����������������
� ����$��� ���� �������� ��� ���� ������� (�2��� ���� ��� ����� ������) � � ��:
• '� finish !������ ���� ��� �!����� �� ��� !�����:
• '�� ���� finish+1 (�� �� finish < QUEUE_SIZE-1)
• '�� ���� 0 (�� �� finish = QUEUE_SIZE-1)
• '� ������� �!� �������� ��� �� finish.
�0&1:
0
array
1
2
345
67 start=1
finish=3
4
5
3
0
array
1
2
345
67 start=1
4
5
35
finish=4QUEUE_SIZE=8
QUEUE_SIZE=8
5
�,'* (!.�. !�� ��� ��� «5»):
A. �����3. +��"��� ����6. )"�!���� � C: ��� ��� %��������
�$���������� �������������� � ����������������
/* QU_enqueue(): Eisagei to x stin oura q
* epistrefei TRUE: se periptwsi epitixias
* FALSE: se periptwsi apotixias */
int QU_enqueue(QUEUE *q,elem x)
{
if (QU_full(*q))
return FALSE;
else
{
if (QU_empty(*q))
{
q->start=0;
q->finish=0;
}
else
{
q->finish=(q->finish+1)%QUEUE_SIZE;
}
q->array[q->finish]=x;
return TRUE;
}
}
start=1
A. �����3. +��"��� ����6. )"�!���� � C: *!�������� %��������
�#���������� �������������� � ����������������
� ��� ����� (��� !�#���) �������� �!� ��� ���� ������� (�2��� ���� ��� ����� �����):
• *!� ��������� �� ������� ��� ��� start (#�� �� �!����2��)
���:
• *� �� start ����� < �!� QUEUE_SIZE-1, ���� ������ start=start+1
• *� �� start ����� = �� QUEUE_SIZE-1 ���� ������ start=0
�0&1:
0
array
1
2
345
67 start=1
finish=3
4
5
3
0
array
1
2
345
67
5
3
QUEUE_SIZE=8
QUEUE_SIZE=8
5
�,'* *x=4
finish=3
A. �����3. +��"��� ����6. )"�!���� � C: *!�������� %��������
������������ �������������� � ����������������
/* QU_dequeue(): Kanei apomakrinsi tou prwtou stoixeiou tis ouras
* epistrefei TRUE: se periptwsi epitixias
* FALSE: se periptwsi apotixias */
int QU_dequeue(QUEUE *q,elem *x)
{
if (QU_empty(*q))
return FALSE;
else
{
*x=q->array[q->start];
if (q->start == q->finish) /* H oura adeiase */
{
q->start=-1;
q->finish=-1;
}
else
{
q->start=(q->start+1)%QUEUE_SIZE;
}
return TRUE;
}
}
A. �����3. +��"��� ����7. )"�!���� � C: ����������
������������ �������������� � ����������������
� �����"����� ��� ����"��� �� project circular_queue.dev �� �!���:
� '� queue.h ���� �� !�����!� �� �������� ��� ��� ��"� ��� �����
� '� queue.c ���� �� #���� �� ��������
� '� main.c ���� ��� !�������� !�� �!��������� ��� ���� ���� ����� �������.
� «��� ��» �� �� !�������� #�� �� ����� !"��� ��������� � "��������� ��� �����.
(. *�����,2������ 1: '����� '��!�$��
���������� �������������� � ���������������� ��
� +��������� ��� !�������� �� �!��� � !������#��� �� "��������� ���� ���!�$�� �� ���
������
� +� � ������ (�!� �� ���) � ����� ��� ���� ��.�"����#� 80 ���������. +� � ���� �
����� �� !�"� 5 !�"����. %��� ��.�"����� � �!� �������� �� �!#���� ��� !�"���.
� '� ����� !�������� � �"�!���� ��� � �� ��������� (��� �!� ��� ����� �!�"��#�):
� 52� � ��"���. �� ���.�$���� �!� ��� ����� �� �!#���� ��� !�"��� ��� �!����: *�
«�����» ��� !�#�� ����, ���� � ��!� ������� � �����, �""�#� � ��!� ������� ���
������� ����. *� ��� ����� � ����� ����, ���� � !�"���� ��� � ������� ������.
� *���#��� ��"���. �� �!�"������ ������ ��� ������ !�� ���� !�"��� ��� �
�!����������� � 1�� !�"���� ��� �������. %��� � ��� � ��!#����� �� �!#���� ��� ���
�� ������ �!� �� �!��� � �!����� ���.
� '�"�� ������������. �� ������� �2����, ���� �� ��� �� ��� ������ ����� �����. %� ���� ���
!���!�� � .��$�� ������ ��� �� !��� ������ ����� ����� !�"���.
)!���� �:
• ��������� ��� � ���"��� ���� ����� «!�� �������» �������� ������!������ ����, ���� ���
��� �!"� ����.
(. *�����,2������ 2: ���� ��������������
���������� �������������� � ���������������� ��
� � ���� !������������� ����� ��� ���� ��������, �!�� �� � ������� !�� !�������� ��
���� �� ��� ���� ���� ��� ���� !�� ��� ������� ��� �� !�� �� ���$�� ��� !������������
��� (�� ����"����� � ���� ��� ��� ���, ��� ����"����� ��� � !������������).
� -��� ���!�� ��� �� �"�!������� ��� ���� �������� «���� ��������������» �����:
� 1� ��!� ������� ���� ����� ������� ��� �� �� ������� ��� ����� !�� �� ���$�� ���
!������������.
� � ������ ��� �������� �� ������� ��� �� �� ��� ����� (�� .�� ���
!������������)
� +��������� ��� !�������� �!���� �� ��� "���������� ��� ����� !�������������,
���!�!��#���� ����""�"� �� project !�� ����������� ��� ��� ���"��� ����.
)!���� �:
• ��������� ��� � ���"��� ���� ����� «!�� �������» �������� ������!������ ����, ���� ���
��� �!"� ����.
(. *�����,2������ 3: ,���!� %������� �����
���������� �������������� � ���������������� ��
� ������� ��� ���"��� ���� ������� !�� ����������� �� �� ���.
� ��"���� �� ������������ ��� ����������� !�� �
� H �!��� � ��!#��� �� ������� ��� �����.
� ,!��������� �� project !�� ����������� ��� ��� ���"��� ���� #�� �� �����#��� ���
����� �� �������.
� � ������� ���� !��!�� �� ��" �� ��� main, �� #� ������� ����������� !�� �.
� ������ ���! � ������� ���� ������� ����������� �!��� �,1 !��!�� �� ����
!��.�� �� ��"� ��� �����.
� )!���� �: �!������ ��� �� ������ .�� ������ ����� (�!� !.�. ��� !������ ����)
� %�� ����� !�������� ��� �����������, ��� �!�"��� ��� ��� ����!� ��� �����, ��
��"����� ���� � �������.
void QU_print(QUEUE *q)
(. *�����,2������ 4: *������2� �����
���������� �������������� � ���������������� �
� ,!��������� �� project ��� �2������� 3, ��� #�� �� ���$���� ��� � � �� ����������� !�� �
��� ��"#��� ��� �����:
� � ������� ���� � �������2�� �� ������� ��� ����� (�� !�#�� ������� �� �������
��"������, �� ������� !����"������, �.��.)
� %�������� �� ������!������ ��� ���.�!
void QU_reverse(QUEUE *q)