You are on page 1of 6

‫‪Data Structures‬‬

‫‪Notes for Lecture 3‬‬


‫‪Linear Data Structures‬‬
‫‪By‬‬
‫‪Samaher Hussein Ali‬‬
‫‪2007-2008‬‬

‫‪2. Stack‬‬

‫اﻟﻤﻜﺪس هﻮ ﻋﺒﺎرة ﻋﻦ ﻗﺎﺋﻤﺔ ﺧﻄﻴﺔ ﺗﺘﻢ ﻓﻴﻬﺎ ﻋﻤﻠﻴﺘﻲ اﻻﺿﺎﻓﺔ ‪ Push‬وﻋﻤﻠﻴﺔ اﻟﺤﺬف ‪ Pop‬ﻣﻦ اﺣﺪى ﻧﻬﺎﻳﺘﻲ اﻟﻘﺎﺋﻤﺔ وﺗﻜﻮن اﻟﻨﻬﺎﻳﺔ‬
‫اﻻﺧﺮى ﻟﻠﻘﺎﺋﻤﺔ ﻣﻐﻠﻘﺔ‪.‬‬

‫‪Push‬‬ ‫‪Pop‬‬

‫‪Stack‬‬

‫ﻧﺴﺘﺨﺪم ﻣﻊ اﻟـ ‪ stack‬ﻣﺆﺷﺮ )‪ (top‬ﻓﻌﻨﺪﻣﺎ ﻳﻜﻮن ‪ top=0‬اذن اﻟـ ‪ stack‬ﻓﺎرغ وﻋﻨﺪﻣﺎ ‪ top=1‬اذن اﻟـ ‪ stack‬ﻳﺤﺘﻮي ﻋﻠﻰ ﻋﻨﺼﺮ واﺣﺪ ‪.‬‬
‫ﻼ اذا آﺎﻧﺖ اﻟﻤﺼﻔﻮﻓﺔ ﺗﺤﺘﻮي ﻋﻠﻰ ‪ n‬ﻣﻦ اﻟﻤﻮاﻗﻊ ﻓﻌﻨﺪهﺎ ﻳﻜﻮن ‪ top=n‬وﻣﻌﻨﻰ‬
‫* ﻳﻤﻜﻦ ﺧﺰن او ﺗﻤﺜﻴﻞ اﻟـ ‪ Stack‬ﺑﻤﺼﻔﻮﻓﺔ اﺣﺎدﻳﺔ ﻓﻤﺜ ً‬
‫ذﻟﻚ ان اﻟـ ‪ Stack‬ﻣﻤﻠﻮء‪.‬‬
‫* ﻳﻌﻤﻞ اﻟـ ‪ stack‬ﺣﺴﺐ ﺳﺘﺮاﺗﺠﻴﺔ اﻟـ )‪Last Input First Output (LIFO‬‬
‫ﻻ ان اﻟـ ‪ top≠n‬اﻣﺎ اذا آﺎن ‪ top=n‬ﻓﻼ ﻳﻤﻜﻦ اﺿﺎﻓﺔ ﻋﻨﺼﺮ اﻟﻰ اﻟـ ‪stack‬‬
‫*ﻋﻨﺪ اﺿﺎﻓﺔ ﻋﻨﺼﺮ ﺟﺪﻳﺪ اﻟﻰ اﻟـ ‪ stack‬ﻳﺠﺐ اﻟﺘﺎآﺪ او ً‬
‫وﺗﺤﺪث ﺣﺎﻟﺔ اﻟـ ‪.overflow‬‬
‫ﻻ ان اﻟـ ‪ top≠0‬اي ان اﻟﻤﻜﺪس ﻏﻴﺮ ﻓﺎرغ ‪ non empty stack‬ﻻﻧﻪ اذا آﺎن‬
‫*ﻋﻨﺪ ﺣﺬف ﻋﻨﺼﺮ ﺟﺪﻳﺪ اﻟﻰ اﻟـ ‪ stack‬ﻳﺠﺐ اﻟﺘﺎآﺪ او ً‬
‫‪ top=0‬ﻓﺴﻮف ﺗﺤﺪث ﺣﺎﻟﺔ اﻟـ ‪.underflow‬‬
‫‪Stack Algorithm‬‬
‫‪A. Push‬‬
‫‪IF stack is full Then‬‬
‫)"‪Print ("stack is overflow‬‬
‫‪Else‬‬
‫‪top = top+1‬‬
‫‪s[top]= item‬‬
‫‪1‬‬
‫‪End‬‬
‫‪B. Pop‬‬
‫‪IF stack is empty Then‬‬
‫)"‪Print ("stack is underflow‬‬
‫‪Else‬‬
‫]‪Item= s[top‬‬
‫‪top =top-1‬‬
‫‪End‬‬

‫اهﻢ ﺗﻄﺒﻴﻘﺎت اﻟﻤﻜﺪس‪-:‬‬


‫‪ .1‬ﻣﻌﺎﻟﺠﺔ اﻟﺒﺮاﻣﺞ اﻟﺘﻲ ﺗﺤﺘﻮي ﻋﻠﻰ ﺑﺮاﻣﺞ ﻓﺮﻋﻴﺔ‬
‫ﻳﺴﺘﺨﺪم اﻟﻤﻜﺪس ﺑﺎهﻤﻴﺔ آﺒﻴﺮة ﻣﻦ ﻗﺒﻞ اﻟﻤﺘﺮﺟﻤﺎت ﻓﻲ ﻣﻌﺎﻟﺠﺔ اﻟﺒﺮاﻣﺞ اﻟﺘﻲ ﺗﺤﺘﻮي ﻋﻠﻰ ﺑﺮاﻣﺞ ﻓﺮﻋﻴﺔ ) ‪functions or‬‬
‫‪ (procedures‬وﺗﻨﻈﻢ ﻃﺮﻳﻘﺔ اﺳﺘﺪﻋﺎﺋﻬﺎ وذﻟﻚ ﺑﺨﺰن ﻋﻨﺎوﻳﻦ اﻟﺮﺟﻮع ‪ . return addresses‬ﻓﻌﻨﺪ اﺳﺘﺪﻋﺎء ﺑﺮﻧﺎﻣﺞ ﻓﺮﻋﻲ ‪procedure‬‬
‫‪ or function‬داﺧﻞ اﻟﺒﺮﻧﺎﻣﺞ اﻟﺮﺋﻴﺴﻲ ﻓﺎن ذﻟﻚ ﻳﺘﻄﻠﺐ ﺧﺰن ﻋﻨﻮان اﻻﻳﻌﺎز اﻟﺘﺎﻟﻲ ﺑﻌﺪ اﻳﻌﺎز اﻻﺳﺘﺪﻋﺎء ﻟﻜﻲ ﻳﺴﺘﻄﻴﻊ اﻟﺒﺮﻧﺎﻣﺞ اﻟﺮﺋﻴﺴﻲ‬
‫ﺗﻨﻔﻴﺬ اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ واﻟﻌﻮدة ﺑﺸﻜﻞ ﺻﺤﻴﺢ اﻟﻰ ﻣﻮﻗﻊ اﻟﺨﻄﻮة او اﻻﻳﻌﺎز اﻟﺘﺎﻟﻲ ﻻن ﻋﻨﻮان هﺬا اﻟﻤﻮﻗﻊ ‪ return address‬ﻳﻜﻮن ﻣﺨﺰون‬
‫ﻓﻲ اﻟﻤﻜﺪس ‪.‬‬
‫‪ .2‬اﺳﺘﺨﺪام اﻟﻤﻜﺪس ﻓﻲ ﻣﻌﺎﻟﺠﺔ اﻟﺘﻌﺎﺑﻴﺮ اﻟﺤﺴﺎﺑﻴﺔ‬
‫ﻼ ﻣﻦ اﻟـ ‪ operators‬واﻟـ ‪. operands‬‬
‫ﻣﻦ اﻟﻤﻌﺮوف ﺑﺎن اﻟﺘﻌﺎﺑﻴﺮ اﻟﺤﺴﺎﺑﻴﺔ ﺗﻜﺘﺐ ﺑﺜﻼث ﺻﻴﻎ ﺑﺎﻻﻋﺘﻤﺎد ﻋﻠﻰ آ ً‬

‫اﻟﺘﺪوﻳﻦ اﻟﺒﻴﻨﻲ )‪(Infix Notation‬‬ ‫•‬


‫وﻓﻴﻪ ﺗﻜﻮن اﺷﺎرة اﻟﻌﻤﻠﻴﺔ اﻟﺤﺴﺎﺑﻴﺔ ﺗﺘﻮﺳﻂ اﻟﻌﻮاﻣﻞ ﻣﺜﺎل ﻋﻠﻰ ذﻟﻚ ‪ x/20‬او ‪. a+b‬‬
‫اﻟﺘﺪوﻳﻦ اﻟﺴﺎﺑﻖ )‪(Prefix Notation‬‬ ‫•‬
‫وﻓﻴﻪ ﺗﻜﻮن اﺷﺎرة اﻟﻌﻤﻠﻴﺔ اﻟﺤﺴﺎﺑﻴﺔ ﺗﺴﺒﻖ اﻟﻌﻮاﻣﻞ ﻣﺜﺎل ﻋﻠﻰ ذﻟﻚ ‪ /x20‬او ‪.+ab‬‬
‫اﻟﺘﺪوﻳﻦ اﻟﻼﺣﻖ)‪(Postfix Notation‬‬ ‫•‬
‫وﻓﻴﻪ ﺗﻜﻮن اﺷﺎرة اﻟﻌﻤﻠﻴﺔ اﻟﺤﺴﺎﺑﻴﺔ ﺗﻠﺤﻖ اﻟﻌﻮاﻣﻞ ﻣﺜﺎل ﻋﻠﻰ ذﻟﻚ ‪ x20 /‬او ‪ ab+‬وﻳﺪﻋﻰ اﻳﻀًﺎ ‪.reverse polish notation‬‬
‫ﻣﻼﺣﻈﺔ‪-:‬‬
‫ﻟﻤﻌﺮﻓﺔ اﻟﺘﻌﺒﻴﺮ اﻟﺤﺴﺎﺑﻲ اذا آﺎن ﻣﻘﺒﻮل ام ﻻ ﻓﺎﻧﻪ ﻳﻌﻄﻰ ﻟﻠـ ‪ operand‬ﻗﻴﻤﺔ )‪ ( +1‬واﻟﻰ اﻟـ ‪ operator‬ﻗﻴﻤﺔ )‪ (-1‬ﻓﺎذا آﺎن ﻣﺠﻤﻮع ﻗﻴﻢ‬
‫اﻟﺘﻌﺒﻴﺮ اﻟﺤﺴﺎﺑﻲ هﻮ)‪ (1‬ﻓﻴﻜﻮن اﻟﺘﻌﺒﻴﺮ ﻣﻘﺒﻮل )‪ (valid‬واﻻ ﻳﻜﻮن اﻟﺘﻌﺒﻴﺮ ﻏﻴﺮ ﻣﻘﺒﻮل )‪(invalid‬‬

‫‪Example:-‬‬

‫‪A-B/C‬‬ ‫‪+1 -1+1-1+1=1‬‬ ‫‪Valid‬‬

‫‪*A/D+N‬‬ ‫‪-1+1-1+1-1+1=0‬‬ ‫‪Invalid‬‬


‫‪2‬‬
Conversion of Infix Expression to Reveres Polish Notation

‫هﻨﺎ ﺳﻮف ﻳﺘﻢ ﺗﻮﺿﻴﺢ آﻴﻒ ﻳﻤﻜﻦ ﻟﻠﻤﺘﺮﺟﻢ اﺟﺮاء ﻋﻤﻠﻴﺔ ﺗﺤﻮﻳﻞ ﺗﻌﺒﻴﺮ ﻣﻦ اﻟﺘﺪوﻳﻦ اﻟﺒﻴﻨﻲ اﻟﻰ اﻟﺘﺪوﻳﻦ اﻟﻼﺣﻖ ﺑﺎﻻﻋﺘﻤﺎد ﻋﻠﻰ ﺟﺪول‬
-:‫اﻻﺳﺒﻘﻴﺎت اﻟﺘﺎﻟﻲ وﺑﺎﺳﺘﺨﺪام اﻟﻤﻜﺪس‬
Precedence Table

Symbol Input Stack Rank(flag)


>=,=,<>,<,>, <= 1 2 -1
/,*,+,-,or , and, div, 3 4 -1
mod
^,not 6 5 -1
variables 7 8 +1
( 9 0
) 0 0

Example:- Translation of infix string a+b*c-d/e*h to reveres polish notation

Symbol Top of stack Suffix Rank(flag)


$ $
a $a
+ $+ a 1
b $+b a 1
* $+* ab 2
c $+*c ab 2
- $- abc*+ 1
d $-d abc*+ 1
/ $-/ abc*+d 2
e $-/e abc*+d 1
* $-* abc*+de/ 2
h $-*h abc*+de/ 2
$ $ abc*+de/h*- 1
valid

3
Example: - Translation of suffix notation string abc*+de/h*- to infix notation
T1=b*c
T2=a+b*c
d
T3=
e
d
T4= *h
e
d
T5 = a + b * c - *h
e

-:suffix ‫ اﻟﻰ ﺻﻴﻐﺔ‬infix ‫ﺧﻮارزﻣﻴﺔ ﺗﺤﻮﻳﻞ اﻟﺘﻌﺎﺑﻴﺮ اﻟﺤﺴﺎﺑﻴﺔ )ﺑﺪون اﻗﻮاس( ﻣﻦ ﺻﻴﻐﺔ‬
‫ ﺳﻮف ﻧﺴﺘﺨﺪم‬suffix ‫ واﻟﻤﻄﻠﻮب ﺗﺤﻮﻳﻠﻪ اﻟﻰ‬infix ‫ وهﻲ ﺗﻤﺜﻞ ﺗﻌﺒﻴﺮ ﺣﺴﺎﺑﻲ ﺑﺼﻴﻐﺔ‬infix ‫ اﺳﻤﻬﺎ‬string ‫ﻧﻔﺮض ﻟﺪﻳﻨﺎ ﺳﻠﺴﻠﺔ ﺣﺮﻓﻴﺔ‬
‫ ﺗﺴﺘﺨﺪم آﻤﺼﻔﻮﻓﺔ اﺣﺎدﻳﺔ ﻟﺨﺰن اﻟﺘﻌﺒﻴﺮ‬polish‫ و‬infix ‫ آﺪاﻟﺔ ﻟﻘﺮاءة اﻟﺮﻣﺰ اﻟﺘﺎﻟﻲ ﻣﻦ اﻟـ‬nextchar‫ آﻤﻜﺪس و‬S ‫ﻣﺼﻔﻮﻓﺔ اﺣﺎدﻳﺔ‬
.suffix ‫اﻟﺤﺴﺎﺑﻲ ﺑﺼﻴﻐﺔ‬
1. [Initialize the stack]
Top 1
S [Top] "$"
2. [Initialize output string and rank count]
Polish=""
Rank=0
3. [Get first input symbol]
Next=nextchar (infix)
4. [Translate the infix expression]
Repeat thrn step6 while
Next<>'$'
5. [Remove symbols with greater than or equal precedence from top of stack]
Repeat while f(next)<=f(S[Top])
Temp pop(S,Top)
Polish polish О Temp
Rank Rank + r (Temp)
If Rank < 1 then
Print ("invalid")
End if

4
‫]‪6. [Push current symbol onto stack and obtain next input symbol‬‬
‫)‪Push(S, Top, Next‬‬
‫‪Next‬‬ ‫‪nextchar‬‬
‫]‪7. [Remove remaining elements from the top of stack‬‬
‫"‪Repeat while S [Top] <>"$‬‬
‫‪Temp‬‬ ‫)‪pop(S, Top‬‬
‫‪Polish‬‬ ‫‪polish О Temp‬‬
‫‪Rank‬‬ ‫)‪Rank + r (Temp‬‬
‫‪If Rank < 1 then‬‬
‫)"‪Print ("invalid‬‬
‫‪End if‬‬
‫]?‪8. [Is the expression valid‬‬
‫‪If Rank=1 then‬‬
‫)"‪Print ("valid‬‬
‫‪Else‬‬
‫)"‪Print ("invalid‬‬
‫‪End if‬‬
‫ﻣﻼﺣﻈﺔ‪-:‬‬
‫اﻟﺘﻌﺒﻴﺮ اﻟﺬي ﻳﻜﻮن ﺑﺼﻴﻌﺔ ‪ suffix‬ﻻﻳﺤﺘﻮي ﻋﻠﻰ أﻗﻮاس ﻧﻬﺎﺋﻴًﺎ وﻋﻨﺪﻣﺎ ﻳﻜﻮن اﻟﺘﻌﺒﻴﺮ اﻟﺤﺴﺎﺑﻲ ﻗﻲ ﺻﻴﻐﺔ ‪ infix‬ﺣﺎوﻳًﺎ ﻋﻠﻰ اﻷﻗﻮاس ﻓﺎﻧﻨﺎ‬
‫ﻧﺴﺘﺨﺪم ﺧﻮارزﻣﻴﺔ أﺧﺮى ﺗﺨﺘﻠﻒ ﻋﻦ ﺳﺎﺑﻘﺘﻬﺎ ﺑﻤﺎ ﻳﻠﻲ‪-:‬‬
‫اذا دﺧﻞ أي ﻋﻨﺼﺮ ﺳﻮاء آﺎن ﻣﻦ اﻟﻤﺘﻐﻴﺮات او ﻋﻤﻠﻴﺔ ﺣﺴﺎﺑﻴﺔ اﻟﻰ اﻟﻤﻜﺪس وآﺎن اﻟﻌﻨﺼﺮ اﻟﻤﻮﺟﻮد ﻓﻲ ﻗﻤﺔ اﻟﻤﻜﺪس ﻣﺴﺎوي ﻟﻪ‬ ‫•‬
‫ﺑﺎﻷﺳﺒﻘﻴﺔ ﻓﺎن ذﻟﻚ اﻟﻌﻨﺼﺮ ﻻﻳﺨﺮج ﻣﻦ اﻟﻤﻜﺪس‪.‬‬
‫اذا دﺧﻞ ﻗﻮس اﻟﺒﺪاﻳﺔ "(" اﻟﻰ اﻟﻤﻜﺪس ﻓﺴﻮف ﻟﻦ ﻳﺨﺮج ﻣﻨﻪ اﻻ اذا وﺻﻠﺖ اﻟﻘﺮاءة اﻟﻰ ﻗﻮس اﻟﻨﻬﺎﻳﺔ ")" واﻟﺬي ﺳﻴﺨﺮج ﺟﻤﻴﻊ‬ ‫•‬
‫اﻟﻌﻨﺎﺻﺮ اﻟﻤﺨﺰوﻧﺔ ﻓﻲ اﻟﻤﻜﺪس واﻟﺘﻲ ﺗﻘﻊ اﻋﻠﻰ اﻟﻘﻮس"("‪.‬‬

‫‪Example:- Translation of infix string (a+b^c^d)*(e/f+d) to reveres polish notation‬‬

‫‪Symbol‬‬ ‫‪Top of stack‬‬ ‫‪Suffix‬‬ ‫)‪Rank(flag‬‬


‫(‬ ‫‪$‬‬
‫‪a‬‬ ‫‪(a‬‬
‫‪+‬‬ ‫‪(+‬‬ ‫‪a‬‬ ‫‪1‬‬
‫‪b‬‬ ‫‪(+b‬‬ ‫‪a‬‬ ‫‪1‬‬
‫^‬ ‫^‪(+‬‬ ‫‪ab‬‬ ‫‪2‬‬

‫‪5‬‬
c (+^c ab 2
^ (+^^ abc 3
d (+^^d abc 3
) abcd^^+ 1
* * abcd^^+ 1
( *( abcd^^+ 1
e *(e abcd^^+ 1
\ *(\ abcd^^+e 2
f *(\f abcd^^+e 2
+ *(+ abcd^^+ef\ 2
d *(+d abcd^^+ef\ 2
) abcd^^+ef\d+* 1
$ valid

Example: - Translation of suffix notation string abcd^^+ef\d+* to infix notation


T1=abc^d
T2=ab^c^d
T3=a+b^c^d
T4=e/f
T5=e/f+d
T6=( a+b^c^d)*( e/f+d)

You might also like