ΣΤΟΙΒΕΣ (stacks) Σχήµα: Λειτουργία Στοίβας

Σχετικά έγγραφα
ΕΠΛ232: Εργαστήριο 2

ΣΤΟΙΒΑ ΧΑΡΑΚΤΗΡΙΣΤΙΚΗ ΙΔΙΟΤΗΤΑ ΤΗΣ ΣΤΟΙΒΑΣ. Το τελευταίο στοιχείο που εισήχθη θα εξαχθεί πρώτο. Άλλο όνομα L I F O (Last In First Out)

ΣΤΟΙΒΑ ΧΑΡΑΚΤΗΡΙΣΤΙΚΗ ΙΔΙΟΤΗΤΑ ΤΗΣ ΣΤΟΙΒΑΣ. Το τελευταίο στοιχείο που εισήχθη θα εξαχθεί πρώτο. Άλλο όνομα L I F O (Last In First Out)

Χρήσεις Στοίβας ΣΤΟΙΒΑ. Ορισμός Στοίβας (stack) Βασική Λειτουργικότητα

Δομές Δεδομένων και Τεχνικές Προγραμματισμού Ενότητα 2: ΑΤΔ Στοίβα. Ιωάννης Κοτρώνης Σχολή Θετικών Επιστημών Τμήμα Πληροφορικής και Τηλεπικοινωνιών

Δομές Δεδομένων. Ενότητα 2: Στοίβες Εισαγωγή-Υλοποίηση ΑΤΔ Στοίβα με Πίνακα-Εφαρμογή Στοίβας: Αντίστροφη Πολωνική Γραφή. Καθηγήτρια Μαρία Σατρατζέμη

ΛΙΣΤΕΣ. Ορισμός ΑΤΔ Λίστα ΑΤΔ Ακολουθιακή Λίστα Διαχείριση Δεικτών και Λιστών στη C ΑΤΔ Συνδεδεμένη Λίστα. Εφαρμογές και Χρήση Λιστών

Δέντρα (Trees) - Ιεραρχική Δομή

Ουρές (Queues) FIFO A B C. Διαγραφή. Εισαγωγή. εµπρός. πίσω. πίσω. πίσω

Γλώσσα Προγραμματισμού C

ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ. for (παράσταση_1; παράσταση_2; παράσταση_3) εντολή επόμενη εντολή

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

ΠΛΗ111. Ανοιξη Μάθηµα 4 ο. Στοίβα. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

υαδικό δέντρο έντρα (Trees) -Ιεραρχική οµή

Εισαγωγή στον Προγραμματισμό

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 2 Εντολές Εισόδου/Εξόδου Τελεστές. Δρ. Γιώργος Λαμπρινίδης 23/10/2015 Η - Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 1

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

ΣΥΜΒΟΛΟΣΕΙΡΕΣ (Strings) Ο ΑΤΔ Συµβολοσειρά Μία συµβολοσειρά είναι µία ακολουθία χαρακτήρων. Bασικές πράξεις : 1. Δηµιουργία. 2. Μήκος. 3.

8. Συνθήκες ελέγχου, λογικοί τελεστές

ΤΕΧΝΟΛΟΓΙΑ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

Κεφάλαιο 4: Συνθήκες Έλεγχου (if-else, switch) και Λογικοί τελεστές / παραστάσεις. (Διάλεξη 8)

ΕΠΛ 231 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου,

Η βασική συνάρτηση προγράμματος main()

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #3

Tύπος δεδοµένων (data type) µιας µεταβλητής (σε µια γλώσσα προγραµµατισµού) είναι το σύνολο των τιµών που µπορεί να πάρει η µεταβλητή.

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

3.1 Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου (Casting)

Διαδικασιακός Προγραμματισμός

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

ΘΕΜΑΤΑ ΕΞΕΤΑΣΗΣ ΚΑΙ ΑΠΑΝΤΗΣΕΙΣ ΤΟΥΣ

ΑΡ Χ Ε Ι Α Κ Ε Ι Μ Ε Ν Ο Υ (text files)

Συλλογές, Στοίβες και Ουρές

Ασκήσεις σε Επαναληπτικούς Βρόχους και Συναρτήσεις. Επανάληψη για την ενδιάμεση εξέταση. (Διάλεξη 13)

Ανάπτυξη και Σχεδίαση Λογισμικού

Γραμμικές Δομές Δεδομένων

Προγραμματισμό για ΗΜΥ

Επισκόπηση Μαθήματος. Γραμμικές Δομές Δεδομένων. ΑΤΔ Ουρά Εναλλακτικοί Σχεδιασμοί Προγραμματισμός με Ενότητες Interface.h Implementation.

scanf() scanf() stdin scanf() printf() int float double %lf float

Δομημένος Προγραμματισμός (ΤΛ1006)

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #5

Αναδρομή (Recursion) Πώς να λύσουμε ένα πρόβλημα κάνοντας λίγη δουλειά και ανάγοντας το υπόλοιπο να λυθεί με τον ίδιο τρόπο.

Οι εντολές ελέγχου της ροής ενός προγράμματος.

Προγραμματισμός Η/Υ (ΤΛ2007 )

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 7 Ο. Αριθμητικές πράξεις Τυχαίοι αριθμοί Εφαρμογές σε προβλήματα ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

ρίζα E F G H I J επίπεδο 1

ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 4-1

Γλώσσα Προγραμματισμού C

Δρ. Πέτρος Παναγή B123

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΕΠΛ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

ΘΕΜΑΤΑ ΕΞΕΤΑΣΗΣ ΚΑΙ ΑΠΑΝΤΗΣΕΙΣ

Αναδροµή (Recursion) ύο παρεξηγήσεις. Σκέψου Αναδροµικά. Τρίγωνο Sierpinski Μη αναδροµικός ορισµός;

Απλά Προγράμματα. Βήματα: 1. Καθορισμός παράστασης δεδομένων στη μνήμη 2. Αλγόριθμος βήματα που περιγράφουν την επεξεργασία των δεδομένων

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

Η γλώσσα προγραμματισμού C

Παρακάτω δίνεται o σκελετός προγράμματος σε γλώσσα C. Σχολιάστε κάθε γραμμή του κώδικα.

Επανάληψη για τις Τελικές εξετάσεις. (Διάλεξη 24) ΕΠΛ 032: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

Βήματα: μνήμη 2. Αλγόριθμος βήματα που περιγράφουν την επεξεργασία των δεδομένων. Δομές Δεδομένων + Αλγόριθμοι = Προγράμματα

Δομές Δεδομένων και Αλγόριθμοι

Ηβασικήσυνάρτηση προγράμματος main()

Προγραμματισμός Η/Υ (ΤΛ2007 )

Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: ΕΠΛ 131 Αρχές Προγραµµατισµού I 3-2

Προγραμματισμός Ι (ΗΥ120)

ΗΥ-150. Προγραµµατισµός. Εντολές Ελέγχου Ροής

2 η Διάλεξη C++ Δρ. Χρήστος Δρόσος ΑΕΙ ΠΕΙΡΑΙΑ ΤΤ ΤΜΗΜΑ ΑΥΤΟΜΑΤΙΣΜΟΥ

Εισαγωγή στον Προγραμματισμό

Προγραμματισμός Ι. Θεματική ενότητα 4: Έλεγχος ροής Προτάσεις υπό συνθήκη διακλάδωσης

Εργαστήριο 5. Εντολή if και παραλλαγές: if-else, πολλαπλές if, πολλαπλές if-else. Απλές και σύνθετες εντολές. Εντολή switch.

Η γλώσσα προγραμματισμού C

Υπολογισμός - Εντολές Ελέγχου

Λογικό "και" (AND) μας επιστρέφει 1 αν και οι δύο operands είναι όχι μηδέν, διαφορετικά 0)

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 3 η : Επίλυση Προβληµάτων Χειµερινό Εξάµηνο 2011

που θα δώσει αποτέλεσµα 48, λόγω της αριστερής προσεταιριστικότητας των τελεστών / και *, ενώ η επιθυµητή αντικατάσταση θα ήταν η

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

ΣΥΝΑΡΤΗΣΕΙΣ (Functions)

Προγραμματισμός Η/Υ (ΤΛ2007 )

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

Περιεχόμενα. Πρόλογος... 21

Εξοικείωση με το πρόγραμμα DEV C++ Επικοινωνία Χρήστη - Υπολογιστή

5 &6. Τύποι δεδομένων, τελεστές και

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Επανάληψη για τις Τελικές εξετάσεις

Γλώσσα Προγραμματισμού C. Προγραμματισμός HY: Γλώσσα Προγραμματισμού C. Γρήγορος Πίνακας Αναφοράς Σύνταξης. Εισήγηση #4. Επαναληπτικές δομές:

ΕΡΓΑΣΤΗΡΙΟ 2 ΕΙΣΑΓΩΓΗ ΣΤΗ C. Εργαστήριο 2. Τµήµα Πληροφορικής και Τηλεπικοινωνιών

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 3 Ο. Σταθερές-Παράμετροι-Μεταβλητές Αριθμητικοί & Λογικοί Τελεστές Δομή ελέγχου-επιλογής Σύνθετοι έλεγχοι

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδηµαϊκό έτος ΑΣΚΗΣΗ #5 Προτεινόµενη λύση

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

Δομές Δεδομένων και Τεχνικές Προγραμματισμού Ενότητα 3: ΑΤΔ Ουρά. Ιωάννης Κοτρώνης Σχολή Θετικών Επιστημών Τμήμα Πληροφορικής και Τηλεπικοινωνιών

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών

Προγραμματισμός Ι. Δομές Δεδομένων. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Εισαγωγή στον Προγραμματισμό (με. τη C)

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Transcript:

ΣΤΟΙΒΕΣ (stacks) Η στοίβα είναι µια συλλογή δεδοµένων µε γραµµική διάταξη στην οποία όλες οι εισαγωγές και οι διαγραφές γίνονται στο ένα άκρο που λέγεται κορυφή (top) της στοίβας Σχήµα: Λειτουργία Στοίβας

Βασικές πράξεις του ΑΤΔ στοίβα Δηµιουργία Εισαγωγή (ώθηση, push) Εξαγωγή (pop) Κενή Πρόβληµα: µετατροπή ενός θετικού ακεραίου από το δεκαδικό στο δυαδικό σύστηµα Αλγόριθµος: τα διαδοχικά υπόλοιπα που προκύπτουν από τις συνεχείς διαιρέσεις του αριθµού µε το 2, αποτελούν τα δυαδικά ψηφία του αριθµού από τα δεξιά (less significant digit) προς τα αριστερά (most significant digit).

Για παράδειγµα, ο 26 στο δυαδικό σύστηµα παριστάνεται σαν 11010 όπως δείχνει και το Σχήµα. Τα ψηφία του δυαδικού συστήµατος που αποτελούν τον αριθµό 26 δηµιουργούνται µε σειρά από το λιγότερο σηµαντικό στο περισσότερο σηµαντικό.

Αλγόριθµος για τη µετατροπή ενός θετικού ακέραιου από το δεκαδικό στο δυαδικό σύστηµα Οσο ο αριθµός <> 0 να εκτελούνται τα παρακάτω: Υπολογισµός του υπολοίπου που προκύπτει από τη διαίρεση του αριθµού µε το 2. Εισαγωγή του υπολοίπου στη στοίβα µε τα υπόλοιπα. Αντικατάσταση του αριθµού µε το ακέραιο πηλίκο του αριθµού δια του 2. Οσο η στοίβα των υπολοίπων δεν είναι άδεια να εκτελούνται τα παρακάτω: Εξαγωγή του υπολοίπου από την στοίβα των υπολοίπων. Εµφάνιση του υπολοίπου.

Υπολογισµός Στοίβα Υπολοίπων Αποτέλεσµα

Υπολογισµός Στοίβα Υπολοίπων Αποτέλεσµα

Υπολογισµός Στοίβα Υπολοίπων Αποτέλεσµα

Υπολογισµός Στοίβα Υπολοίπων Αποτέλεσµα

Υλοποίηση του αλγορίθµου χρησιµοποιώντας τον ΑΤΔ στοίβα dimiourgia(&stoiva); while (arithmos!= 0) ypoloipo = arithmos % 2; othisi(&stoiva, ypoloipo); arithmos = arithmos / 2; printf ( Η παράσταση του αριθµού στο δυαδικό σύστηµα είναι η : ); while (!keni(stoiva)) exagogi(&stoiva, &ypoloipo); print(ypoloipo);

Υλοποίηση του ΑΤΔ στοίβα µε πίνακα : #define plithos... typedef... typos_stoixeiou; typedef typos_stoixeiou typos_pinaka[plithos]; typedef struct int korifi; typos_pinaka pinakas; typos_stoivas;

Δηµιουργία της στοίβας : void dimiourgia(typos_stoivas *stoiva) /*Προ : Καµµία. Μετα : Δηµιουργία κενής στοίβας*/ stoiva->korifi = -1;

Ελεγχος αν µια στοίβα είναι κενή : int keni(typos_stoivas stoiva) /* Προ : Δηµιουργία στοίβας. Μετά : Επιστρέφει 1 αν η στοίβα είναι κενή, διαφορετικά επιστρέφει 0.*/ return (stoiva.korifi == -1);

Η λειτουργία της εξαγωγής αποτελείται από τρεις ενέργειες : 1. Αν η στοίβα είναι κενή, τότε τυπώνεται ένα µήνυµα και σταµατά η εκτέλεση του προγράµµατος 2. Εξάγεται το στοιχείο που δείχνει η korifi από τη στοίβα. 3. Επιστρέφει την τιµή του στοιχείου που εξάχθηκε στο κύριο πρόγραµµα.

Η υλοποίηση της εξαγωγής γίνεται από το ακόλουθο υποπρόγραµµα : void exagogi(typos_stoivas *stoiva, typos_stoixeiou *stoixeio) /* Προ : H στοίβα δεν είναι κενή. Μετά : Εξάγεται το stoixeio από τη stoiva*/ if (keni(*stoiva)) printf( Η στοίβα είναι κενή ); else *stoixeio=stoiva->pinakas[stoiva->korifi]; stoiva->korifi--;

Μια άλλη µορφή της exagogi είναι η παρακάτω: void exagogi(typos_stoivas *stoiva, typos_stoixeiou *stoixeio, int *ypoxeilisi) /* Προ : Μη κενή στοίβα. Μετα : Εξάγεται το stoixeio από τη stoiva και η τιµή της ypoxeilisi είναι 0, διαφορετικά είναι 1. */ if (keni(*stoiva)) *ypoxeilisi = 1; else *ypoxeilisi = 0; *stoixeio = stoiva->pinakas[stoiva->korifi]; stoiva->korifi = stoiva->korifi -1; συνέχεια

Στο κύριο πρόγραµµα όπου καλείται η εξαγωγή συνήθως γράφεται ο κώδικας : exagogi(&stoiva, &stoixeio, &ypoxeilisi); if (ypoxeilisi) /*να γίνει διορθωτική ενέργεια*/ else /*stoixeio είναι το στοιχείο που εξάγεται από την στοίβα*/

Η υλοποίηση της εισαγωγής είναι παρόµοια µε εκείνη της εξαγωγής και γίνεται από το ακόλουθο υποπρόγραµµα : void othisi(typos_stoivas *stoiva, typos_stoixeiou stoixeio) /* Προ : Δηµιουργία στοίβας. Μετα : Εισάγει το stoixeio στη στοίβα*/ if (stoiva->korifi == plithos-1) printf( Η στοίβα είναι γεµάτη ); else stoiva->korifi++; stoiva->pinakas[stoiva->korifi]=stoixeio;

Χρησιµοποιώντας αντί µηνύµατος µια λογική µεταβλητή έχουµε την παρακάτω µορφή της othisi: void othisi(typos_stoivas *stoiva, typos_stoixeiou stoixeio, int *yperheilisi); /*Αν η στοίβα είναι πλήρης, τότε η τιµή της yperheilisi είναι 1, διαφορετικά είναι 0*/ if (stoiva->korifi == plithos-1) *yperheilisi = 1; else *yperheilisi = 0; stoiva->korifi++; stoiva->pinakas[stoiva->korifi]=stoixeio;

Εφαρµογές µε τη χρήση στοίβας Μετατροπή ακεραίου από το δεκαδικό στο δυαδικό σύστηµα Εχοντας υλοποιήσει τις βασικές πράξεις της στοίβας µπορούµε να προχωρήσουµε στην κωδικοποίηση του αλγορίθµου για την µετατροπή ενός θετικού ακεραίου από το δεκαδικό στο δυαδικό σύστηµα. #include <stdio.h> #define plithos 100 typedef int typos_stoixeiou; typedef typos_stoixeiou typos_pinaka[plithos]; typedef struct int korifi; typos_pinaka pinakas; typos_stoivas; συνέχεια

void dimiourgia(typos_stoivas *stoiva); int keni(typos_stoivas stoiva); int exagogi(typos_stoivas *stoiva, typos_stoixeiou *stoixeio); int othisi(typos_stoivas *stoiva, typos_stoixeiou stoixeio); main( ) int arithmos; int ypoloipo; typos_stoivas stoiva; printf( Δώσε τον αριθµό: ); scanf("%d",&arithmos); dimiourgia(&stoiva); συνέχεια

while (arithmos!=0) ypoloipo=arithmos % 2; othisi(&stoiva,ypoloipo); arithmos=arithmos / 2; printf( Ο αριθµός στο δυαδικό σύστηµα είναι:\n"); while (!keni(stoiva) ) exagogi(&stoiva,&ypoloipo); printf("%d",ypoloipo); printf("\n\n");

Υπολογισµός Αριθµητικών Παραστάσεων - Πολωνικός Συµβολισµός A + (B * C) A + (BC * ) A(BC *) + ABC * + Ενδοθεµατική µορφή Μεταθεµατική µορφή Οι κανόνες που διέπουν τη µετατροπή µιας αριθµητικής παράστασης από την ενδοθεµατική στη µεταθεµατική µορφή είναι : 1) Οι πράξεις που έχουν τη µεγαλύτερη προτεραιότητα πρέπει να µετατραπούν πρώτες 2) Μόλις µετατραπεί ένα τµήµα της παράστασης σε µεταθεµατική µορφή θα πρέπει το τµήµα αυτό να εκλαµβάνεται σαν ένας όρος.

Παράδειγµα Να µετατραπεί η παράσταση: A ^ B * C - D + E / F / (G + H) A ^ B * C - D + E / F / (GH + ) (AB ^) * C - D + E / F / (GH + ) (AB ^ C *) - D + E / F / (GH + ) (AB ^ C *) - D + (EF /) / (GH + ) (AB ^ C *) - D + (EF / GH + /) (AB ^ C * D - ) + (EF / GH + /) AB ^ C * D - EF / GH + / + µεταθεµατική µορφή

Περιττές οι παρενθέσεις στη Μεταθεµατική µορφή Ας υποθέσουµε ότι έχουµε την ενδοθεµατική µορφή: (1 + 5) * (8 - (4-1)) η οποία έχει τη µεταθεµατική µορφή: 15 + 841 - - * 15 + 841 - - * Αντικαθιστώντας την υπογραµµισµένη παράσταση µε την τιµή του αποτελέσµατος 1 + 5, δηλαδή µε το 6 έχουµε την 6 8 4 1 - - * 6 8 4 1 - - * Αντικαθιστώντας την υπογραµµισµένη παράσταση µε την τιµή της 4-1 έχουµε 6 8 3 - * Συνεχίζοντας λαµβάνουµε διαδοχικά: 6 8 3 - * 6 5 * 30 τιµή της παράστασης.

Αλγόριθµος για τον υπολογισµό της µεταθεµατικής µορφής 1. Να δηµιουργηθεί µια στοίβα. 2. Οσο υπάρχουν σύµβολα στην είσοδο να εκτελούνται οι παρακάτω εργασίες: a. Πάρε το επόµενο σύµβολο (σταθερά, µεταβλητή, αριθµητικός τελεστής) της µεταθεµατικής µορφής. b. Αν είναι όρος (δηλ. σταθερά ή µεταβλητή), τότε να εισαχθεί στη στοίβα διαφορετικά /*τελεστής*/ (i) Βγάλε πρώτα δύο στοιχεία - όρους της στοίβας (Αν η στοίβα δεν περιέχει δύο στοιχεία - όρους, τότε η µεταθεµατική παράσταση είναι λάθος και ο υπολογισµός της σταµατά). (ii) Εφάρµοσε τον τελεστή για τους δύο όρους. (iii) Τοποθέτησε το αποτέλεσµα στη στοίβα. 3. Το αποτέλεσµα του υπολογισµού της µεταθεµατικής µορφής βρίσκεται στην κορυφή της στοίβας.

Εφαρµογή του Αλγορίθµου Ενδοθεµατική : 2 * 4 - ( 9 + 5 ) Μεταθεµατική : 2 4 * 9 5 + - Παράσταση Στοίβα Σχόλια Τοποθέτηση του 2 στη στοίβα Τοποθέτηση του 4 στη στοίβα Εξαγωγή των 4 και 2, υπολογισµός της 4*2=8 και τοποθέτηση του 8 στη στοίβα Τοποθέτηση του 9 στη στοίβα

Παράσταση Στοίβα Σχόλια Τοποθέτηση του 5 στη στοίβα Εξαγωγή των 5 και 9, υπολογισµός της 9+5=14 και τοποθέτηση του 14 στη στοίβα Εξαγωγή των 14 και 8, υπολογισµός της 8-14=-6 και τοποθέτηση του -6 στη στοίβα Η τιµή της παράστασης βρίσκεται στη κορυφή της στοίβας

Πρόγραµµα για τον υπολογισµό της τιµής µιας µεταθεµατικής παράστασης (υποθέτουµε ότι η είσοδος περιέχει µια σειρά από θετικούς µονοψήφιους ακέραιους και αριθµητικούς τελεστές µόνο) #include <stdio.h> #include <stdlib.h> #define plithos 80 typedef float typos_stoixeiou; typedef typos_stoixeiou typos_pinaka[plithos]; typedef struct int korifi; typos_pinaka pinakas; typos_stoivas; συνέχεια

float telestis(char symbolo, float oros1, float oros2); void dimiourgia(typos_stoivas *stoiva); int keni(typos_stoivas stoiva); void exagogi(typos_stoivas *stoiva, typos_stoixeiou *stoixeio); void othisi(typos_stoivas *stoiva, typos_stoixeiou stoixeio); main( ) typos_stoivas stoiva; float oros1, oros2, apotelesma; char symbolo, apantisi, metathematiki[256]; int i; συνέχεια

do dimiourgia(&stoiva); i=0; printf( Δώσε τη παράσταση: ); while ( (symbolo=getchar( ))!= '\n' ) metathematiki[i]=symbolo; i++; if (symbolo!= ' ' ) /*αγνοεί τα κενά*/ if (symbolo >= '0' && symbolo <= '9') apotelesma= (float) symbolo - '0'; othisi(&stoiva, apotelesma); συνέχεια

else /* είναι τελεστής */ exagogi(&stoiva,&oros2); exagogi(&stoiva,&oros1); apotelesma = telestis(symbolo, oros1, oros2); othisi(&stoiva, apotelesma); /* while..!= \n */ metathematiki[i]='\0'; exagogi(&stoiva, &apotelesma); printf("%s=5.2f\n",metathematiki, apotelesma); printf( Θέλεις να συνεχίσεις; (Υ/Ν)\n"); scanf ("%c",&apantisi); while (apantisi == 'N' apantisi == 'n'); συνέχεια

float telestis (char symbolo, float oros1,oros2) switch (symbolo) case '+' : return (oros1+oros2); break; case '-' : return (oros1-oros2); break; case '*' : return (oros1*oros2); case '/' : break; return (oros1/oros2); break; default : printf ( Λάθος!\n ); return (-1.0);

Μετατροπή Ενδοθεµατικής στη Μεταθεµατική µορφή A + B * C A B C * + Οι όροι τυπώνονται Οι τελεστές αποθηκεύονται A + B * C A + B * C + A A A + B * C + AB A + B * C * + AB

A + B * C * + ABC A + B * C ABC*+ Αν προ(τελεστή) > προ(τελεστή στοίβας) τότε ώθηση του τελεστή στη στοίβα διαφορετικά εξαγωγή του τελεστή από τη στοίβα

A * B + C A * B + C AB*C+ A A * B + C * A A * B + C * AB A * B + C AB*

A * B + C + AB* A * B + C + AB*C A * B + C AB*C+

A + B - C A A + B - C + A A + B - C + AB A + B - C - AB+ A + B - C - AB+C A + B - C AB+C-

Αλγόριθµος για την µετατροπή της ενδοθεµατικής παράστασης σε µεταθεµατική 1. Δηµιουργία µιας κενής στοίβας τελεστών. 2. Οσο δεν έχει συναντηθεί το τέλος της ενδοθεµατικής µορφής και δεν υπάρχει λάθος, να εκτελούνται οι παρακάτω εργασίες : (a) Πάρε το επόµενο σύµβολο (σταθερά, µεταβλητή, αριθµητικός τελεστής, αριστερή ή δεξιά παρένθεση) της ενδοθεµατικής µορφής. (b) Αν το σύµβολο αυτό είναι: (i) µια αριστερή παρένθεση : τότε να τοποθετηθεί στη στοίβα. (ii) µια δεξιά παρένθεση: τότε να εξαχθούν από τη στοίβα όλοι οι τελεστές µέχρις ότου στην κορυφή της στοίβας βρεθεί µια αριστερή παρένθεση. (Σε περίπτωση που η στοίβα γίνει κενή χωρίς της ανεύρεση αριστερής παρένθεσης, τότε η ενδοθεµατική µορφή είναι λανθασµένη).

(iii) ένας τελεστής: Αν η στοίβα είναι κενή ή ο τελεστής έχει µεγαλύτερη προτεραιότητα από τον τελεστή που βρίσκεται στην κορυφή της στοίβας, τότε τοποθετείται στη στοίβα. Διαφορετικά, εξάγεται και τοποθετείται στη µεταθεµατική σειρά ο τελεστής που βρίσκεται στην κορυφή της στοίβας. Η εργασία αυτή επαναλαµβάνεται µε τον επόµενο τελεστή που βρίσκεται στην κορυφή της στοίβας. Ας σηµειωθεί ότι µια αριστερή παρένθεση που βρίσκεται στη στοίβα υποτίθεται ότι έχει µικρότερη προτεραιότητα από εκείνη του τελεστή. (iv) ένας όρος: τότε να προστεθεί στη µεταθεµατική σειρά (να εκτυπωθεί). 3. Οταν συναντηθεί το τέλος της ενδοθεµατικής µορφής, τότε να εξαχθούν και να τοποθετηθούν µε τη σειρά όλα τα στοιχεία της στοίβας µέχρις ότου γίνει κενή.

Στο ακόλουθο σχήµα εµφανίζεται η εφαρµογή του αλγόριθµου για την έκφραση 7 * 8 - (2 + 3) Παράσταση Στοίβα Εκτύπωση Σχόλια 7 *8-(2+3) κενή 7 Εκτύπωση του 7 * 8-(2+3) * 7 ώθηση του * 8 -(2+3) * 78 Εκτύπωση του 8 - (2+3) 78* Εξαγωγή και εκτύπωση του * (2+3) - 78* ώθηση του -

Παράσταση Στοίβα Εκτύπωση Σχόλια ( 2+3) 2 +3) ( - ( - 78* ώθηση της ( 78*2 Εκτύπωση του 2 + 3) + ( - 78*2 ώθηση του + 3 ) + ( - 78*23 Εκτύπωση του 3

Παράσταση Στοίβα Εκτύπωση Σχόλια ( - ) 78*23+ Εξαγωγή και εκτύπωση του + - 78*23+ Εξαγωγή της ( τέλος της παράστασης 78*23+- Εξαγωγή και εµφάνιση του -

Στη συνέχεια ακολουθεί το πρόγραµµα για τη µετατροπή µιας ενδοθεµατικής παράστασης στην αντίστοιχη µεταθεµατική. #include <stdio.h> #include <stdlib.h> #define plithos 80 #define mikos 80 #define telos ; /* ένδειξη τέλους ενδοθεµατικής παράστασης */ #define synolo_teleston +-*/ /* σύνολο τελεστών */ typedef char typos_stoixeiou; typedef typos_stoixeiou typos_pinaka[plithos]; typedef struct int korifi; typos_pinaka pinakas; typos_stoivas; typedef typos_stoixeiou typos_parastasis[mikos]; συνέχεια

void dimiourgia(typos_stoivas *stoiva); int keni(typos_stoivas stoiva); int exagogi(typos_stoivas *stoiva, typos_stoixeiou *stoixeio); int othisi(typos_stoivas *stoiva, typos_stoixeiou stoixeio); int protereotita(char telestis); void metatropi (typos_parastasis endo_parastasi); συνέχεια

main( ) typos_parastasis endo_parastasi; int i; fflush(stdin); printf( Δώσε την παράσταση\n ); i=-1; do i++; endo_parastasi[i] = getchar( ); while (endo_parastasi[i]!=telos); i++; endo_parastasi[i]='\0'; printf ( Μετατροπή της παράστασης:"); metatropi(endo_parastasi); printf ("\n"); συνέχεια

int protereotita(char telestis) /* Επιστρέφει την προταιρεότητα του τελεστή telestis.. */ switch (telestis) case '(': return 0; case '+': case '-': return 1; case '*': case '/': return 2; συνέχεια

void metatropi (typos_parastasis endo_parastasi) /* Αυτή η υπορουτίνα µετατρέπει την ενδοθεµατική µορφή µιας παράστασης στην µεταθεµατική της µορφή */ typos_stoivas stoiva; int i; char symbolo, symbolo_korifi ; int lathos, telos_exagogis; dimiourgia (&stoiva); lathos = 0; /* αρχή της µετατροπής */ i = 0; symbolo = endo_parastasi[0]; συνέχεια

while ((symbolo!=telos) && (! lathos )) while ( endo_parastasi[i] == ' ' ) /*Αγνόηση κενών*/ i++; symbolo = endo_parastasi[i]; if ( symbolo == '(' ) /* αριστερή παρένθεση */ othisi(&stoiva, symbolo); else if ( symbolo == ')' ) /* δεξιά παρένθεση*/ telos_exagogis = 0; συνέχεια

do if (keni(stoiva)) lathos = 1; else exagogi( &stoiva, &symbolo_korifi ); if ( symbolo_korifi!= '(' ) printf("%2c", symbolo_korifi); else telos_exagogis = 1; while ( (! telos_exagogis ) && (! lathos ) ); /* δεξιά παρένθεση*/ συνέχεια

else if ( strchr( synolo_teleston, symbolo )!= NULL ) /* τελεστής */ telos_exagogis = 0; while ( (! keni(stoiva)) && (! telos_exagogis) ) exagogi( &stoiva, &symbolo_korifi ); if (((protereotita( symbolo))<=(protereotita( symbolo_korifi))) printf("%2c", symbolo_korifi); else othisi( &stoiva, symbolo_korifi ); telos_exagogis = 1; othisi(&stoiva, symbolo); συνέχεια

else /* όρος*/ if (symbolo!= telos) printf("%2c", symbolo); i++; /* main while */ /* Εξαγωγή και εκτύπωση των στοιχείων της στοίβας. */ while ( (! keni(stoiva) ) && (! lathos ) ) exagogi(&stoiva, &symbolo_korifi); if (symbolo_korifi!= '(') printf("%2c", symbolo_korifi); else lathos = 1; if ( lathos ) printf ( Λάθος στην ενδοθεµατική παράσταση.\n ); else printf ("\n");