Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Edit 2014 posts #37

Merged
merged 15 commits into from
Aug 10, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 11 additions & 24 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -1,27 +1,14 @@
Copyright (c) 2016, Nir Galon.
All rights reserved.
ISC License

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
Copyright (c) 2016, Nir Galon

1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
Permission to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted, provided that the above copyright notice and this permission
notice appear in all copies.

2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.

3. Neither the name of Open Knesset nor the names of its contributors may be used
to endorse or promote products derived from this software without
specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT
SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
USE OR PERFORMANCE OF THIS SOFTWARE.
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
Stories of a Lifelong Student
===

[![license](https://img.shields.io/badge/license-ISC-blue.svg)](https://github.com/nirgn975/Stories-of-a-Lifelong-Student/blob/master/LICENSE)

My private blog.

## Prerequisites
Expand Down
59 changes: 37 additions & 22 deletions _posts/2014-02-09-stack.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,39 @@
title: מחסנית (Stack)
author: nirgn
layout: post
summary: "מחסנית (באנגלית: Stack), הינו מבנה נתונים מופשט הפועל ( מבנה לוגי, בניגוד למערך בו קיימת רציפות פיסית בזיכרון) בצורה דומה למחסנית של רובה. בנוסף, מבנה הנתונים עושה שימוש ברעיון של מבנה נתונים קיים, אך מייצג אותו באופן שונה (נהוג להגיד: מודל מתמטי שונה עבור מבנה נתונים בעל התנהגות דומה)."
category: Data Structures
---
[<img class="alignleft wp-image-1045" src="http://www.lifelongstudent.net/wp-content/uploads/2013/04/DataStructures.png" alt="Dataֹׁ Structures" width="350" height="227" srcset="http://www.lifelongstudent.net/wp-content/uploads/2013/04/DataStructures.png 400w, http://www.lifelongstudent.net/wp-content/uploads/2013/04/DataStructures-300x194.png 300w" sizes="(max-width: 350px) 100vw, 350px" />](http://www.lifelongstudent.net/wp-content/uploads/2013/04/DataStructures.png)מחסנית (באנגלית: Stack), הינו מבנה נתונים מופשט הפועל בצורה דומה למחסנית של רובה.
מחסנית (באנגלית: Stack), הינו מבנה נתונים מופשט הפועל בצורה דומה למחסנית של רובה.

<span style="text-decoration: underline;">למה הכוונה "<strong>מבנה נתונים מופשט</strong>"?</span>
**למה הכוונה "מבנה נתונים מופשט"?**

ז"א שמבנה הנתונים הינו מבנה לוגי (בניגוד למערך בו קיימת רציפות פיסית בזיכרון). בנוסף, מבנה הנתונים עושה שימוש ברעיון של מבנה נתונים קיים, אך מייצג אותו באופן שונה (נהוג להגיד: מודל מתמטי שונה עבור מבנה נתונים בעל התנהגות דומה). מבנה הנתונים הנ"ל הינו ייצוג שונה של מבנה הנתונים מערך, שאותו כבר הכרנו (ניתן לייצגו גם ע"י רשימה מקושרת).

<!--more-->

<div class="left">
<img src="/assets/img/posts/stack/Stack.png" alt="Stack" style="width: 15rem;">
</div>

&nbsp;

על מנת להבין כיצד עובד המבנה נהוג לייצר מחסנית (לאורך כמובן) כמו בציור מצד שמאל.
<img class="alignleft wp-image-1208" src="http://www.lifelongstudent.net/wp-content/uploads/2014/02/Stack.png" alt="Stack" width="300" height="216" />בנוסף, אולי מיותר לציין, כי מבנה הנתונים עובד בשיטת <a href="https://en.wikipedia.org/wiki/LIFO_(computing)" target="_blank">LIFO</a> (ראשי תיבות: Last In First Out), ז"א שבדיוק כמו במחסנית, האיבר האחרון שנכנס הוא הראשון שיוצא (או הראשון שנכנס הוא האחרון לצאת).
על מנת להבין כיצד עובד המבנה נהוג לייצר מחסנית (לאורך כמובן) כמו בציור מצד שמאל.
(ראשי תיבות: Last In First Out), ז"א שבדיוק כמו במחסנית, האיבר האחרון שנכנס הוא הראשון שיוצא (או הראשון שנכנס הוא האחרון לצאת).

למבנה הנתונים מחסנית יש כמה פעולות בסיסיות שאיתן עובדים, את הפעולות הנ"ל יש לממש, ולכן כעת, נראה את הפעולות, מה הן אמורות לעשות, ואת המימוש שלהן ב<a href="http://en.wikipedia.org/wiki/Pseudocode" target="_blank">פסאודו קוד</a>.
למבנה הנתונים מחסנית יש כמה פעולות בסיסיות שאיתן עובדים, את הפעולות הנ"ל יש לממש, ולכן כעת, נראה את הפעולות, מה הן אמורות לעשות, ואת המימוש שלהן ב[פסאודו קוד](http://en.wikipedia.org/wiki/Pseudocode).

&nbsp;

<span style="text-decoration: underline;">הפעולות הבסיסיות:</span>
**דחיפה &#8211;** הכנסת איבר חדש (לראש) המחסנית.
### הפעולות הבסיסיות:
**דחיפה -** הכנסת איבר חדש (לראש) המחסנית.
קוד:

<pre class="lang:default decode:true">PUSH (S, x)
```c
PUSH (S, x)
top[S] &lt;- top[S] + 1
S[top[S]] &lt;- x</pre>
S[top[S]] &lt;- x
```

* S הוא שם המחסנית.
* x הוא האיבר החדש שאותו אנו מכניסים למחסנית.
Expand All @@ -37,14 +44,16 @@ S[top[S]] &lt;- x</pre>

&nbsp;

**שליפה &#8211;** הוצאת האיבר (מראש) המחסנית.
**שליפה -** הוצאת האיבר (מראש) המחסנית.
קוד:

<pre class="lang:default decode:true">POP (S)
```c
POP (S)
if (EMPTY (S))
then error "underflow"
else top[S] &lt;- top[S] - 1
return S[top[S] + 1]</pre>
return S[top[S] + 1]
```

* S הוא שם המחסנית.
* אם המחסנית ריקה, נחזיר הודעת שגיאה.
Expand All @@ -53,44 +62,50 @@ else top[S] &lt;- top[S] - 1

&nbsp;

<span style="text-decoration: underline;">בנוסף,נדגים את פעולות השינוי Pop ו Push:</span>
**בנוסף,נדגים את פעולות השינוי Pop ו Push:**

[<img class="aligncenter wp-image-1216" src="http://www.lifelongstudent.net/wp-content/uploads/2014/02/Push__Pop_Example.png" alt="Push & Pop Example" width="800" height="126" />](http://www.lifelongstudent.net/wp-content/uploads/2014/02/Push__Pop_Example.png)
<div style="text-align: center;">
<img src="/assets/img/posts/stack/Push__Pop_Example.png" alt="Push & Pop Example">
</div>

מימוש המחסנית S מתבצע באמצעות מערך. איברי המחסנית מופיעים רק במשבצות הבהירות. (i) המחסנית S מכילה 4 איברים; האיבר הנמצא בראשה הוא 9. (ii) המחסנית S אחרי הקריאות (PUSH(S,17 ו (PUSH(S,3. בשלב הבא, (iii), המחסנית S אחרי הקריאה (POP(S החזירה את האיבר 3, שהוא האיבר האחרון שהוכנס למחסנית. על אף שהאיבר 3 עדיין מופיע במערך, הוא אינו שייך עוד למחסנית; בראש המחסנית נמצא האיבר 17. (כל אחת מהפעולות האלו מתבצעת בזמן ריצה (O(1).

&nbsp;

<span style="text-decoration: underline;">לפעמים (בעיקר בשביל הנוחות), מוגדרות על מחסנית פעולות נוספות:</span>
**האם ריקה? &#8211;** הפעולה מחזירה true או false אם המחסנית ריקה או לא (בהתאמה).
לפעמים (בעיקר בשביל הנוחות), מוגדרות על מחסנית פעולות נוספות:
**האם ריקה? -** הפעולה מחזירה true או false אם המחסנית ריקה או לא (בהתאמה).
קוד:

<pre class="lang:default decode:true">EMPTY (S)
```c
EMPTY (S)
if (top[S] = 0)
return True
else return False</pre>
else return False
```

* S הוא שם המחסנית.
* אם [top[S ריק (ז"א שווה 0), אז אין איברים במחסנית, ולכן מחזירים true.
* אחרת נחזיר false.

&nbsp;

**הצצה &#8211;** פעולה המחזירה את ערכו של האיבר בראש המחסנית (מבלי להוציאו מהמחסנית). [top[s משמש כאינדקס של האיבר האחרון שהוכנס.
**הצצה -** פעולה המחזירה את ערכו של האיבר בראש המחסנית (מבלי להוציאו מהמחסנית). [top[s משמש כאינדקס של האיבר האחרון שהוכנס.
קוד:

<pre class="lang:default decode:true">STACK-TOP (S)
```c
STACK-TOP (S)
if EMPTY(S)
then error "underflow"
return S[top[S]]</pre>
return S[top[S]]
```

* S הוא שם המחסנית.
* נבדוק האם המחסנית ריקה, במידה וריקה נחזיר הודעת שגיאה.
* כל עוד המחסנית אינה ריקה, מחזירים את הערך במחסנית (/מערך) S במקום top.

&nbsp;

## <span style="text-decoration: underline;"><strong>לסיכום</strong></span>
### לסיכום

אלה הן הפעולות הבסיסיות וקצת מעבר על מבנה הנתונים מחסנית. המחסנית ממומשת, לרוב, באמצעות מערך, אך גם ניתנת למימוש באמצעות רשימה מקושרת, ובשפות תוכנות מסויימות גם באמצעות רשימה. למחסנית יש המון שימושים ויישומים בפועל, ונחשבת למבנה נתונים בסיסי.

Expand Down
Loading