You are on page 1of 17

# 17. .

,

FIFO (First-In-First-Out) - , ..
, (.
17.1).
Q[1]

Q[2]

...

Q[k]

. 17.1.
, ,
,
, ..
:
1. ( ).
2. .
3. .

.

()
( 0).
(. 17.2).
1

Q[1]

Q[k]

0
0

Q[k]

1
..

..
.

j.

Q[1]
Q[2]

.
N

) <

) >

. 17.2.
( )
, .
,
(
).
.
,
:
. ,
( N
0).
,
.

(C++)
1.
#define N 50 /* */
_ Och [N+1]; /* , */
int un, uk;
/* */
2. ( )

un = uk = 0;
3.

X
if (un != uk) /* */
{ X = Och [un];
if (un < N) un++; else un = 0;
}

if (un != uk)
{ X = Och [un++];
if (un > N) un = 0;
}
4. X

int i; /* */
if (uk<N) i = uk +1;
else i = 0;
if (i != uk) /* */
{ Och [uk] = X;
uk = i;
}
else /* */

:
(. 17.3).
1- -

2- -

n- -
0

...

. 17.3.
(C++)
1.
/* */
struct EL_OCH
{ _ inf; /* ( ) */
struct EL_OCH * sled; /* */
};
struct EL_OCH *un, *uk;
/* */
2. ( )

un = uk = NULL;
3.

X
) , X
1- , 2-
, 1- (. 17.4).
inf

sled
0

...
un

uk
. 17.4. ,

) , X

, ,
(. 17.5).
inf

sled
0

un

uk

. 17.5. ,

.
/* */
if ( !Iskluch (&un, &uk, &X) ) puts( );
/* */
int Iskluch(struct EL_OCH **p_un, struct EL_OCH **p_uk, _ *pX)
/* p_un un */
/* p_uk uk */
/* pX X */
/* 1 0,
.*/
{ struct EL_OCH *i;
if (*p_un != NULL) /* */
{ i = *p_un;
*pX = i -> inf;
*p_un = i -> sled;
free (i);
if (*p_un == NULL) /* */
*p_uk = NULL;
return 1;
}
return 0;
}
4. , X.

X, 0.
(. 17.6).
, ,
(. 17.7).
inf

sled

-
0

...
un

uk
5

. 17.6.
-
0

un

uk

. 17.7.

.
/* */
Vkluch (&un, &uk, X);
/* */
void Vskluch (struct EL_OCH **p_un, struct EL_OCH **p_uk, _ X)
/* p_un un */
/* p_uk uk */
/* X */
{ struct EL_OCH *i; /* */
i = (struct EL_OCH *) malloc (sizeof (struct EL_OCH));
i -> inf = X;
i -> sled = NULL;
if (*p_un != NULL) /* */
(*p_uk) -> sled = i;
else *p_un = i;
*p_uk = i;
}

.
,
().
, .. ,
. ,

, (
).

(stack) - ,

LIFO (Last-In-First-Out) - " - ", . .
(. 17.8).
, - .
: ( ),
LIFO.

S[1]

S[2]

S[k]

. 17.8.
: ,
; ,
.
.
1.

.
2.
, (.
).
3. ( )
.
7

4. .
5. : , ,
, .
6. .
7. (7 2 ). ,
, ,

, . .
:
1. (, );
2. () - PUSH;
3. () - POP;
4. ;
5. ;
6. ( /
).

(. 17.9).

. 17.9.

, - .

( ).
(
, ).
,
(. 17.10).

A[1]
...

A[k]

B[m]
...

B[1]

. 17.10.
,
.
.
.
(++)
1.
#define N 100
- st[N];
int ist;

/*
*/
/*
*/
/* ( ) */

2. () :
9

ist = -1;
,
.
, .
3. X
( ==> X; : ==>):
- X;
...
if (ist >= 0)
{ X = st[ist];
ist--;
}
else . . .

/*

*/

/*
/*
/*

*/
*/
*/

/*

*/

4. , X (
<== X):
- X;
...
if (ist < N-1)
{ ist++;
st[ist] = X;
}
else . . .

/*

*/

/*
/*
/* x

*/
*/
*/

/*

*/

. 80 ,
.
+, -, *, /. .
, : 130+25*3-160/20*6 .
: 157.
,
. * / ,
, + - .
10

(),
,
.

, ,
.
. 17.11 , .

-
-

130 + 1 130+1
25 * 2 75-1
3 - 1

205-1
160/2
20*2

205-1
8*2
6 0

205-1
48 0

157 0

. 17.11. , .
.
:
#include <stdio.h>
#include <conio.h>
/**/
/* */
/* */
/**/
int hislo ( char text [], int *i )
/* :
*/
/*
text - ,
*/
/*
*i - text. */
/* :
*/
/*
*i - . */
/*
*/
{ int c=0; /* */
while (text[*i]>='0' && text[*i]<='9')
11

{ c=c*10+(text[*i]-'0');
(*i)++;
}
return c;
}
/**/
/*

*/
/**/
main()
{ char text [80]; /* . - . */
int i ;
/* text */
float opd [3]; /* */
char opc [3]; /* */
int pr [3] ; /* */
int j = -1 ; /* */
printf ("\n .\n");
gets (text);
i=-1;
do
{ i++;
/* , */
opd[++j] = hislo(text,&i); opc[j] = text[i];
switch (text[i])
{
case '+':
case '-': pr[j]=1; break;
case '*':
case '/': pr[j]=2; break;
case ' ' /* */: pr[j]=0;
}
while (j>0 && pr[j]<=pr[j-1])
{
/* */
switch (opc[j-1])
{ case '+' : opd[j-1] = opd[j-1] + opd[j]; break;
case '-' : opd[j-1] = opd[j-1] - opd[j]; break;
case '*' : opd[j-1] = opd[j-1] * opd[j]; break;
case '/' : opd[j-1] = opd[j-1] / opd[j];
}
/* */
opc[j-1]=opc[j]; pr[j-1]=pr[j]; j=j-1;
}
}
12

## while (text[i]!=' ');

printf (": %.2f\n",opd[0]);
getch();
}

:
.
9/4-12
: -9.75
.
10*2/5+6/3
: 6.00
.
130+25*3-160/20*6
: 157.00
.
2345
: 2345.00

, (. 17.12).

S[k]
...
S[1] 0

1. ?

2. ?
3. , :
13

1
0

1
8

2
1
1

1
7

1
3

1
2

un=6 uk=3 .
.
.
15
.
4.

10

, 8 2 .
2- 3- .
,
.
5. , ,
, .
1, , 0 .
. .
6. .
20 . .
7. .
( ). .

. .
8. ?
9. ?
10. , , .

. .

14

1. .
2.
.
3. .
5. .

1. 20 ,

+, -, *, /.
, .
.
. : a*b+c/d-e
: ab*cd/+e2.

) 20 , .
,
( ).
)

R1,R2,R3,...
.
. :

abc*+def+/-

: R1:=b*c
R2:=a+R1
R3:=e+f
R4:=d/R3
R5:=R2-R4
15

R1,R2,R3,...,
.
.
. :

abc*+def+/-

: R1:=b*c
R1:=a+R1
R2:=e+f
R2:=d/R2
R2:=R1-R2
3. 30 ,
. +,
-, *, /
. , .
.
. : 345+2*63/-+= 19

4.

50

.
.
1 4 8 10 14 19

27

. : (a+(b+c)/(a-b)*(x+(y+2)**3))/2
: 4 8
10 14
19 23
16 27
1 28
.

.
16

5. , .
)

, ,
, . :
. : 5 -1 -20 -8 10 14 -3 5 -2 -13 -7 0
:

-8 -20 -1 -3 -7 -13 -2

.
.
)

, ,
, . :
. : -2 5 10 20 15 -4 -6 2 -10 3 1 4 -5 0
:
.

15 20 10 5 2 4 1 3

.
6. n (n<=20) .
10 . ,
, . :
. :

17