Professional Documents
Culture Documents
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
Example:-
هﻨﺎ ﺳﻮف ﻳﺘﻢ ﺗﻮﺿﻴﺢ آﻴﻒ ﻳﻤﻜﻦ ﻟﻠﻤﺘﺮﺟﻢ اﺟﺮاء ﻋﻤﻠﻴﺔ ﺗﺤﻮﻳﻞ ﺗﻌﺒﻴﺮ ﻣﻦ اﻟﺘﺪوﻳﻦ اﻟﺒﻴﻨﻲ اﻟﻰ اﻟﺘﺪوﻳﻦ اﻟﻼﺣﻖ ﺑﺎﻻﻋﺘﻤﺎد ﻋﻠﻰ ﺟﺪول
-:اﻻﺳﺒﻘﻴﺎت اﻟﺘﺎﻟﻲ وﺑﺎﺳﺘﺨﺪام اﻟﻤﻜﺪس
Precedence Table
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ﺣﺎوﻳًﺎ ﻋﻠﻰ اﻷﻗﻮاس ﻓﺎﻧﻨﺎ
ﻧﺴﺘﺨﺪم ﺧﻮارزﻣﻴﺔ أﺧﺮى ﺗﺨﺘﻠﻒ ﻋﻦ ﺳﺎﺑﻘﺘﻬﺎ ﺑﻤﺎ ﻳﻠﻲ-:
اذا دﺧﻞ أي ﻋﻨﺼﺮ ﺳﻮاء آﺎن ﻣﻦ اﻟﻤﺘﻐﻴﺮات او ﻋﻤﻠﻴﺔ ﺣﺴﺎﺑﻴﺔ اﻟﻰ اﻟﻤﻜﺪس وآﺎن اﻟﻌﻨﺼﺮ اﻟﻤﻮﺟﻮد ﻓﻲ ﻗﻤﺔ اﻟﻤﻜﺪس ﻣﺴﺎوي ﻟﻪ •
ﺑﺎﻷﺳﺒﻘﻴﺔ ﻓﺎن ذﻟﻚ اﻟﻌﻨﺼﺮ ﻻﻳﺨﺮج ﻣﻦ اﻟﻤﻜﺪس.
اذا دﺧﻞ ﻗﻮس اﻟﺒﺪاﻳﺔ "(" اﻟﻰ اﻟﻤﻜﺪس ﻓﺴﻮف ﻟﻦ ﻳﺨﺮج ﻣﻨﻪ اﻻ اذا وﺻﻠﺖ اﻟﻘﺮاءة اﻟﻰ ﻗﻮس اﻟﻨﻬﺎﻳﺔ ")" واﻟﺬي ﺳﻴﺨﺮج ﺟﻤﻴﻊ •
اﻟﻌﻨﺎﺻﺮ اﻟﻤﺨﺰوﻧﺔ ﻓﻲ اﻟﻤﻜﺪس واﻟﺘﻲ ﺗﻘﻊ اﻋﻠﻰ اﻟﻘﻮس"(".
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