ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ & ΑΛΓΟΡΙΘΜΟΙ ΕΡΓΑΣΤΗΡΙΟ Κωδικός Θ: ΤΠ3001, Κωδικός Ε: ΤΠ3101 (ΜΕΥ/Υ) Ώρες (Θ - Ε): 4-2 Προαπαιτούμενα: Δρ. ΒΙΔΑΚΗΣ ΝΙΚΟΣ
ΕΡΓΑΣΤΗΡΙΟ 6 Στοίβα (Stack)
Stack Introduction Stack is one of the fundamental data structures in computer science. Is a last in, first out (LIFO) data structure. Is characterized by only two fundamental operations push and pop. It is used in many algorithms and applications. As an example, stack is used: implicitly in recursion. for expression evaluation. to check the correctness of parentheses sequence. etc. The push operation adds to the top of the list, hiding any items already on the stack, or initializing the stack if it is empty. The pop operation removes an item from the top of the list, reveals previously concealed items, or results in an empty list. Μάθημα: Δομές Δεδομένων & Αλγόριθμοι (Εργαστήριο) Καθηγητής: Δρ. Βιδάκης Νίκος Slide 3
Stack Methods Stack is an data structure in which we are using two methods: 1. to put an object in the stack(push) We have to check, if the stack if full before we put (stack_push) any object to the stack Stack 2. to get an object from the stack(pop). We have to check, is the stack is empty before we get (stack_pop) an object from the stack Μάθημα: Δομές Δεδομένων & Αλγόριθμοι (Εργαστήριο) Καθηγητής: Δρ. Βιδάκης Νίκος Slide 4
Stack data structure working sequence Working of stack: Ας θεωρήσουμε το array A[0],A[1],A[2]... A[n-1],A[n] είναι η στοίβα μας με πρώτο στοιχείο το A[0] και τελευταίο είναι το A[n]. Και έχουμε μια μεταβλητή σαν δείκτη, όπου κρατάει σε ποιο στοιχείο μπορούμε να τοποθετήσουμε στοιχείο στο πίνακα(έστω το p)! Βήματα pop και push. Pop: 1. Compare p and 0. 2. If p>0 take the object from the array and p=p-1, else the stack is empty. Push: 1. Compare p and n. 2. If p<n put the object to the array and p=p+1,else the stack is full. Μάθημα: Δομές Δεδομένων & Αλγόριθμοι (Εργαστήριο) Καθηγητής: Δρ. Βιδάκης Νίκος Slide 5
Stack Working with Stack (visual paradigm) Μάθημα: Δομές Δεδομένων & Αλγόριθμοι (Εργαστήριο) Καθηγητής: Δρ. Βιδάκης Νίκος Slide 6
Stack Working with Stack Example Example array values: 12, 9, 4, 99, 120 1.pop(12) empty list 2.pop(9) 12 3.push( ) 9 12 4.pop(4) 12 5.pop(99) 4 12 6.pop(120) 99 4 12 7.push() 120 99 4 12 8.push() 99 4 12 9.push() 4 12 10.push() 12 empty list Μάθημα: Δομές Δεδομένων & Αλγόριθμοι (Εργαστήριο) Καθηγητής: Δρ. Βιδάκης Νίκος Slide 7
public class Stack { private int top; private int[ ] storage; Stack(int capacity) { if (capacity <= 0) throw new IllegalArgumentException( "Stack's capacity must be positive"); storage = new int[capacity]; top = -1; void push(int value) { if (top == storage.length) throw new StackException("Stack's underlying storage is overflow"); top++; storage[top] = value; int peek() { Stack Example code in Java if (top == -1) throw new StackException("Stack is empty"); return storage[top]; void pop() { if (top == -1) throw new StackException("Stack is empty"); top--; boolean isempty() { return (top == -1); public class StackException extends RuntimeException { public StackException(String message) { super(message); Μάθημα: Δομές Δεδομένων & Αλγόριθμοι (Εργαστήριο) Καθηγητής: Δρ. Βιδάκης Νίκος Slide 8
#include <string> using namespace std; class Stack { private: int top; int capacity; int *storage; public: Stack(int capacity) { if (capacity <= 0) throw string("stack's capacity must be positive"); storage = new int[capacity]; this->capacity = capacity; top = -1; void push(int value) { if (top == capacity) throw string("stack's underlying storage is overflow"); top++; storage[top] = value; Stack Example code in C++ ; int peek() { if (top == -1) throw string("stack is empty"); return storage[top]; void pop() { if (top == -1) throw string("stack is empty"); top--; bool isempty() { return (top == -1); ~Stack() { delete[] storage; Μάθημα: Δομές Δεδομένων & Αλγόριθμοι (Εργαστήριο) Καθηγητής: Δρ. Βιδάκης Νίκος Slide 9
#include<stdio.h> #define N 5 main() { int a[n]={0; int sp=-1,ch,n,i; while(ch!=4) { printf("\n\t 1.PUSH."); printf("\n\t 2.POP."); printf("\n\t 3.DISPLAY."); printf("\n\t 4.EXIT "); printf("\n\t ENTER UR CHOICE :::: "); scanf("%d",&ch); if(ch==1) { if(sp>=n) { printf("\n\t STACK FULL "); break; printf("\n\t ENTER DATA:::: "); scanf("%d",&n); sp++; a[sp]=n; Stack Example code in C if(ch==2) { printf("\n\t POPPED VALUE ::: %d",a[sp]); a[sp]=0; sp--; if(ch==3) { for(i=sp;i>=0;i--) { printf("\n\t %d",a[i]); getchar(); Copyrights: http://www.dailyfreecode.com/code/stack-array- 2417.aspx Μάθημα: Δομές Δεδομένων & Αλγόριθμοι (Εργαστήριο) Καθηγητής: Δρ. Βιδάκης Νίκος Slide 10
Visual Paradigms Brooklyn Stack Java Applet Stack in Java Applets Centre Μάθημα: Δομές Δεδομένων & Αλγόριθμοι (Εργαστήριο) Καθηγητής: Δρ. Βιδάκης Νίκος Slide 11
Bibliography http://www.wikipedia.org http://www.roseindia.net http://www.liv.ac.uk/hpc/htmlf90course/htmlf90coursenotesnode176.html http://www.algolist.net http://www.cosc.canterbury.ac.nz/mukundan/dsal/stackappl.html http://acc6.its.brooklyn.cuny.edu/~cis22/animations/tsang/html/stack/stack640.html Μάθημα: Δομές Δεδομένων & Αλγόριθμοι (Εργαστήριο) Καθηγητής: Δρ. Βιδάκης Νίκος Slide 12
Ασκήσεις Άσκηση 1 Να υλοποιήσετε μια στοίβα χρησιμοποιώντας διασυνδεδεμένη λίστα. Κάθε στοιχείο της στοίβας πρέπει αποτελείται από έναν χαρακτήρα. Χρησιμοποιώντας τη στοίβα, να υλοποιήσετε πρόγραμμα που θα ελέγχει τη σωστή χρήση των παρενθέσεων σε μία αριθμητική παράσταση. Το πρόγραμμα θα διαβάζει μιαν αριθμητική παράσταση σαν συμβολοσειρά που αποτελείται από χαρακτήρες μεταβλητές, σύμβολα αριθμητικών πράξεων (+, *, /, ^), παρενθέσεις, και ενδεχομένως κάποια κενά. Το πρόγραμμα θα ελέγχει την αριθμητική παράσταση και θα αποφαίνεται σχετικά με τη σωστή χρήση των παρενθέσεων (και μόνο). Αν υπάρχει πρόβλημα, θα επισημαίνεται η πρώτη παρένθεση χωρίς ταίριασμα. Ζητούμενο: Να χρησιμοποιήσετε το παραπάνω πρόγραμμα για να ελέγξετε τις παρακάτω εκφράσεις ως προς τη σωστή χρήση των παρενθέσεων. 1. (a*(b+c)+d)*(d*(b+c+a)-(e*f)+d)*(a+b+c*(((r+e)-(u+i))*k+5*r*t)) 2. ((b+c-r)*r*k+d*(w+10))*(d*(b+c+a((s+r)))*a-(e*f)+d)*(a+b+c*(((r+e)- ((u+i))*k+5*r*t)) 3. (a+b(c*d)+(d(e)+a-(d/b+(a*g)))*(a+b(c*d)+(d(e)+a-(d/b+(a*g))))*r+f Η άσκηση είναι από το Εργαστήριο Δομών Δεδομένων του: Τμήμα Μηχανικών Πληροφοριακών και Επικοινωνιακών Συστημάτων Σχολή Θετικών Επιστημών, Πανεπιστήμιο Αιγαίου Μάθημα: Δομές Δεδομένων & Αλγόριθμοι (Εργαστήριο) Καθηγητής: Δρ. Βιδάκης Νίκος Slide 13
Ασκήσεις Άσκηση 2 Υλοποιήστε κατάλληλο κώδικα χρησιμοποιώντας στοίβες, κατάλληλους αλγορίθμους ταξινόμησης και εύρεσης έτσι ώστε να προσομοιώσετε το γέμισμα και το άδειασμα ενός ψυγείου παγωτών όπου στόχος είναι να παίρνουμε πάντα τα ποιο φρέσκα παγωτά. Υπάρχουν 4 διαφορετικά είδη παγωτών. Θεωρήστε ότι το ψυγείο χωράει 40 παγωτά, 10 από κάθε είδος. Γέμισμα: Ελέγχεται το πόσα παγωτά λείπουν από κάθε είδος και μετά γεμίζει το ψυγείο με αυτά που λείπουν. Άδειασμα: Ο χρήστης δηλώνει τι είδος παγωτό/τα θέλει και πόσα από κάθε είδος π.χ. 1 παγωτό σοκολάτα ή 1 παγωτό σοκολάτα και 1 φράουλα ή 1 παγωτό σοκολάτα και 2 φράουλα. Μάθημα: Δομές Δεδομένων & Αλγόριθμοι (Εργαστήριο) Καθηγητής: Δρ. Βιδάκης Νίκος Slide 14
Ασκήσεις για C 1. Να τροποποιηθεί το παράδειγμα σε C έτσι ώστε να λειτουργεί με τις συναρτήσεις pop(), push() και disp(). 2. Να γραφτεί ένα πρόγραμμα που διαβάζει μια ακολουθία 10 χαρακτήρων και την τυπώνει με αντίστροφη σειρά. Να χρησιμοποιηθούν δύο στοίβες (μία για το input και μία για το output) και οι λειτουργίες που υλοποιήθηκαν στην άσκηση 1. Μάθημα: Δομές Δεδομένων & Αλγόριθμοι (Εργαστήριο) Καθηγητής: Δρ. Βιδάκης Νίκος Slide 15