τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Γεια σας φίλοι Ας μάθουμε τη δομή δεδομένων της στοίβας σήμερα!
Στοίβα: Μια ειδική γραμμική λίστα που επιτρέπει μόνο λειτουργίες εισαγωγής και διαγραφής σε σταθερό άκρο. Το άκρο που εισέρχεται στις λειτουργίες εισαγωγής και διαγραφής δεδομένων ονομάζεται κορυφή της στοίβας και το άλλο άκρο ονομάζεται κάτω μέρος της στοίβας.Τα στοιχεία δεδομένων στη στοίβα συμμορφώνονται μεLIFO Αρχή (Last In First Out). Μπορούμε να το φανταστούμε σαν να τρώμε κεμπάπ προβάτου,Βάλτο πρώταΤα κομμάτια του προβάτου πιέζονται μέσακάτω μέρος,το τελευταίοΤα κομμάτια του προβάτου είναι μέσαΣτην κορυφήτου.
Σπρώξιμο της στοίβας: Η λειτουργία εισαγωγής της στοίβας ονομάζεται push/push/push.Εισαγάγετε δεδομένα από την κορυφή της στοίβας。
Pop: Η λειτουργία διαγραφής της στοίβας ονομάζεται popping.Τα εξερχόμενα δεδομένα βρίσκονται επίσης στην κορυφή της στοίβας。
Η στοίβα μπορεί γενικά να υλοποιηθεί χρησιμοποιώντας έναν πίνακα για την υλοποίηση της στοίβας ή χρησιμοποιώντας μια συνδεδεμένη λίστα για την υλοποίηση της στοίβαςδομή πίνακαΗ εφαρμογή της στοίβας είναι απλούστερη και πιο αποτελεσματική.
Επειδή κατά την υλοποίηση της προσθήκης, διαγραφής, τροποποίησης και διεπαφής ερωτήματος του προηγούμενου πίνακα ακολουθιών (πίνακας ακολουθίας δομών δεδομένων) Είναι πολύ βολικό για εμάς να χρησιμοποιήσουμε τη δομή του πίνακα για εισαγωγή και διαγραφή από το τέλος, οπότε στην υλοποίηση της στοίβας ορίζουμε το άκρο του πίνακα ως το πάνω μέρος της στοίβας και το κεφάλι ως το κάτω μέρος του η στοίβα.
Η στοίβα, όπως και η λίστα ακολουθιών, μπορεί να σχεδιαστεί ως στατική στοίβα σταθερού μήκους ή ως δυναμικά αναπτυσσόμενη στοίβα.Επειδή η στοίβα σταθερού μήκους έχει μεγάλους περιορισμούς και δεν είναι πρακτική στην πράξη, εφαρμόζουμε κυρίως υποστήριξηΔυναμικά αναπτυσσόμενη στοίβα。
Όπως και στην προηγούμενη εφαρμογή διασύνδεσης λίστας ακολουθιών/συνδεδεμένης λίστας, δημιουργούμε πρώτα ένα αρχείο κεφαλίδας "Stack.h" και δύο αρχεία προέλευσης "Stack.c" και "Test.c".
Στοίβα.η | Ορισμός στοίβας, αναφορά αρχείου κεφαλίδας και δήλωση λειτουργίας διεπαφής |
Στοίβα.γ | Υλοποίηση λειτουργιών διεπαφής |
Δοκιμή.γ | Δοκιμάστε κάθε λειτουργία |
Ας δείξουμε πρώτα τον πλήρη κώδικα του "Stack.h", μην ξεχάσετε να αναφέρετε το "Stack.h" στα 2 αρχεία πηγής
- #pragma once //防止头文件被二次引用
- #include<stdio.h>
- #include<stdlib.h>
- #include<assert.h>
-
- typedef int ElemType; //如果要修改存储的数据类型可直接在此修改
- typedef struct Stack {
- ElemType* arr; //动态数组
- int top; //栈顶
- int capacity; //容量
- }Stack;
-
-
- void StackInit(Stack* ps);//初始化栈
-
- void StackPush(Stack* ps, ElemType x);//入栈
-
- void StackPop(Stack* ps);//出栈
-
- ElemType StackTop(Stack* ps);//获取栈顶元素
-
- int StackSize(Stack* ps);//获取栈中有效元素的个数
-
- int StackEmpty(Stack* ps);//检测栈是否为空,如果为空返回非零结果,如果不为空返回0
-
- void StackDestroy(Stack* ps);//销毁栈
Μεταξύ αυτών, η έννοια του "κορυφή" καθορίζεται από την αρχική τιμή, η οποία θα εξηγηθεί λεπτομερώς παρακάτω. Στη συνέχεια ξεκινάμε την υλοποίηση της διεπαφής.
- //初始化栈
- void StackInit(Stack* ps) {
- assert(ps); //断言,防止传入空指针
- ps->arr = NULL; //初始化数组,置空
- ps->capacity = 0;//top指向栈顶元素的下一个位置
- ps->top = 0; //初始化容量
- }
Για ευκολία κατανόησης, κατανοούμε κατά προσέγγιση την κορυφή στη δομή ως δείκτη του πίνακα.Εάν αρχικοποιήσουμε την κορυφή στο 0 κατά την προετοιμασία της στοίβας, δεν υπάρχουν δεδομένα στη στοίβα και η κορυφή δείχνει στην επόμενη θέση των κορυφαίων δεδομένων στη στοίβα.
Εάν αρχικοποιήσουμε το top σε -1, το top θα δείχνει τη θέση των κορυφαίων δεδομένων στη στοίβα. Είναι καλύτερο για εμάς να το αρχικοποιήσουμε στο 0 εδώ γιατί είναι βολικό να προσθέσουμε στοιχεία και να διαγράψουμε στοιχεία.
- //入栈
- void StackPush(Stack* ps, ElemType x) {
- //扩容
- if (ps->capacity == ps->top) //容量已满,需要扩容
- {
- //如果容量为0,则扩容到4; 否则扩大2倍
- int newCapacity = ps->capacity == 0 ? 4 : 2 * (ps->capacity);
- //创建一个临时指针变量来存储新空间地址,防止开辟失败
- ElemType* temp = realloc(ps->arr, newCapacity * sizeof(ElemType));
- if (temp == NULL) //防止开辟失败出现空指针
- {
- perror("realloc fail!n");
- exit(1);
- }
- ps->arr = temp; //将临时指针变量中存放的新空间地址赋给arr
- ps->capacity = newCapacity;//空间容量更新
- }
- ps->arr[ps->top] = x;//将数据存放进栈顶元素的下一个位置
- ps->top++;//位置更新
- }
Επειδή υπάρχει διαφορά μεταξύ της στοίβας και του πίνακα ακολουθίας, δεν μπορούμε απευθείας να διασχίσουμε και να εκτυπώσουμε. Επομένως, εάν θέλουμε να εκτυπώσουμε τα στοιχεία στη στοίβα, πρέπει να χρησιμοποιήσουμε τη συνάρτηση StackEmpty και τη συνάρτηση StackPop, η οποία θα συζητηθεί αργότερα. .
- //出栈
- void StackPop(Stack* ps) {
- assert(ps); //断言,防止传入空指针
- assert(ps->top); //断言,防止栈中没有元素,却还在执行删除
- ps->top--; //top指针往前挪动一位(相当于这个位置被覆盖了)
- }
- //获取栈顶元素
- ElemType StackTop(Stack* ps) {
- assert(ps); //断言,防止传入空指针
- assert(ps->top); //断言,防止栈为空
- return ps->arr[ps->top - 1];//top-1为栈顶元素的位置,返回其值
- }
- //获取栈中有效元素的个数
- int StackSize(Stack* ps) {
- assert(ps); //断言,防止传入空指针
- return ps->top; //top即为有效元素的个数
- }
- //检测栈是否为空,如果为空返回非零结果,如果不为空返回0
- int StackEmpty(Stack* ps) {
- assert(ps); //断言,防止传入空指针
- return ps->top == 0; //如果top==0, 说明栈为空
- }
Αυτός είναι ο λόγος για τον οποίο το StackEmpty στον προηγούμενο ισχυρισμό πρέπει να προστεθείτελεστής λογικής άρνησηςΟ λόγος είναι ότι εάν η στοίβα είναι κενή, το StackEmpty επιστρέφει true και η άρνηση του false μπορεί να αποδείξει ότι υπάρχουν στοιχεία στη στοίβα.
- //销毁栈
- void StackDestroy(Stack* ps) {
- assert(ps); //断言,防止传入空指针
- if (ps->arr) //如果动态数组有效
- {
- free(ps->arr); //释放arr
- ps->arr = NULL; //将arr置空
- }
- ps->capacity = 0; //数组的容量为0
- ps->top = 0; //数组的栈顶top为0
-
- }
Αφού ολοκληρωθούν όλες οι διεπαφές, ας δοκιμάσουμε τον κώδικα στο Test.c:
Ας το δοκιμάσουμε λίγο ακόμα:
Κανένα πρόβλημα Συγχαρητήρια για την ολοκλήρωση της εφαρμογής της στοίβας.
- #include"Stack.h"
-
- //初始化栈
- void StackInit(Stack* ps) {
- assert(ps); //断言,防止传入空指针
- ps->arr = NULL; //初始化数组,置空
- ps->capacity = 0;//top指向栈顶元素的下一个位置
- ps->top = 0; //初始化容量
- }
-
- //入栈
- void StackPush(Stack* ps, ElemType x) {
- //扩容
- if (ps->capacity == ps->top) //容量已满,需要扩容
- {
- //如果容量为0,则扩容到4; 否则扩大2倍
- int newCapacity = ps->capacity == 0 ? 4 : 2 * (ps->capacity);
- //创建一个临时指针变量来存储新空间地址,防止开辟失败
- ElemType* temp = realloc(ps->arr, newCapacity * sizeof(ElemType));
- if (temp == NULL) //防止开辟失败出现空指针
- {
- perror("realloc fail!n");
- exit(1);
- }
- ps->arr = temp; //将临时指针变量中存放的新空间地址赋给arr
- ps->capacity = newCapacity;//空间容量更新
- }
- ps->arr[ps->top] = x;//将数据存放进栈顶元素的下一个位置
- ps->top++;//位置更新
- }
-
- //出栈
- void StackPop(Stack* ps) {
- assert(ps); //断言,防止传入空指针
- assert(ps->top); //断言,防止栈中没有元素,却还在执行删除
- ps->top--; //top指针往前挪动一位(相当于这个位置被覆盖了)
- }
-
- //获取栈顶元素
- ElemType StackTop(Stack* ps) {
- assert(ps); //断言,防止传入空指针
- assert(ps->top); //断言,防止栈为空
- return ps->arr[ps->top - 1];//top-1为栈顶元素的位置,返回其值
- }
-
- //获取栈中有效元素的个数
- int StackSize(Stack* ps) {
- assert(ps); //断言,防止传入空指针
- return ps->top; //top即为有效元素的个数
- }
-
- //检测栈是否为空,如果为空返回非零结果,如果不为空返回0
- int StackEmpty(Stack* ps) {
- assert(ps); //断言,防止传入空指针
- return ps->top == 0; //如果top==0, 说明栈为空
- }
-
- //销毁栈
- void StackDestroy(Stack* ps) {
- assert(ps); //断言,防止传入空指针
- if (ps->arr) //如果动态数组有效
- {
- free(ps->arr); //释放arr
- ps->arr = NULL; //将arr置空
- }
- ps->capacity = 0; //数组的容量为0
- ps->top = 0; //数组的栈顶top为0
-
- }
1. Ποια από τις παρακάτω προτάσεις σχετικά με τις στοίβες είναι σωστή ( )
Α. Η στοίβα είναι μια δομή δεδομένων "first in first out".
Β. Η στοίβα μπορεί να υλοποιηθεί χρησιμοποιώντας μια συνδεδεμένη λίστα ή μια διαδοχική λίστα
Γ. Η στοίβα μπορεί να εισάγει δεδομένα μόνο στο κάτω μέρος της στοίβας
Δ. Η στοίβα δεν μπορεί να διαγράψει δεδομένα
σωστή απάντηση: σι
Σφάλμα: Η στοίβα είναι μια δομή δεδομένων last-in-first-out και η ουρά είναι first-in, first-out.
Το B είναι σωστό: Και οι λίστες ακολουθιών και οι συνδεδεμένες λίστες μπορούν να χρησιμοποιηθούν για την υλοποίηση στοίβων, αλλά οι λίστες ακολουθιών χρησιμοποιούνται γενικά επειδή η στοίβα θεωρείται ως ευνουχισμένη έκδοση της λίστας ακολουθιών χρησιμοποιείται και η εισαγωγή της ουράς του πίνακα ακολουθίας χρησιμοποιείται.
Σφάλμα C: Η στοίβα μπορεί να εκτελέσει λειτουργίες εισαγωγής και διαγραφής εισόδου μόνο στο επάνω μέρος της στοίβας
Σφάλμα D: Η στοίβα έχει λειτουργίες push and pop είναι να διαγράψετε ένα στοιχείο από τη στοίβα.
2. Η ακολουθία ώθησης μιας στοίβας είναι ABCDE και η αδύνατη ακολουθία pop είναι ( )
A.ABCDE
B.EDCBA
C.DCEBA
D.ECDBA
σωστή απάντηση: ρε
Εάν το E βγει πρώτο, σημαίνει ότι το ABCDE έχει ωθηθεί στη στοίβα. Αφού το E βγει από τη στοίβα, το επάνω στοιχείο της στοίβας είναι D. Εάν βγει ξανά, θα πρέπει να είναι D, όχι C. .
Επομένως, θα πρέπει να επιλεγεί το D
3. Σε σύγκριση με τη διαδοχική στοίβα, τα προφανή πλεονεκτήματα της στοίβας αλυσίδας είναι ( )
Α. Η λειτουργία εισαγωγής είναι πιο βολική
Β. Η λειτουργία διαγραφής είναι πιο βολική
Γ. Δεν απαιτείται επέκταση κατά την ώθηση στη στοίβα
σωστή απάντηση: ντο
Σφάλμα A. Εάν είναι μια συνδεδεμένη στοίβα, απαιτεί γενικά λειτουργίες εισαγωγής κεφαλής ή διαγραφής κεφαλής, ενώ μια διαδοχική στοίβα εκτελεί γενικά λειτουργίες εισαγωγής και διαγραφής ουράς Η λειτουργία μιας συνδεδεμένης λίστας είναι πιο περίπλοκη από έναν διαδοχικό πίνακα απλούστερη η χρήση μιας διαδοχικής δομής για την υλοποίηση μιας στοίβας.
Το Β είναι λάθος, ανατρέξτε στο Α για τον λόγο.
Το C είναι σωστό Όταν η στοίβα υλοποιείται σε μια δομή αλυσίδας, κάθε ώθηση στη στοίβα ισοδυναμεί με την εισαγωγή ενός κόμβου στην κεφαλή της συνδεδεμένης λίστας.
4. Ποια από τις παρακάτω προτάσεις σχετικά με τη χρήση στοίβων για την υλοποίηση ουρών είναι λανθασμένη ( )
Α. Η χρήση της προσομοίωσης στοίβας για την υλοποίηση μιας ουράς μπορεί να χρησιμοποιήσει δύο στοίβες, μια στοίβα προσομοιώνει την είσοδο στην ουρά και μια στοίβα προσομοιώνει την έξοδο από την ουρά.
Β. Κάθε φορά που κάνετε dequeue, θα πρέπει να εισάγετε όλα τα στοιχεία μιας στοίβας σε μια άλλη στοίβα και στη συνέχεια να την αναδυάσετε.
Γ. Κατά την είσοδο στην ουρά, απλώς αποθηκεύστε τα στοιχεία απευθείας στη στοίβα που προσομοιώνει την είσοδο στην ουρά.
Δ. Η χρονική πολυπλοκότητα της λειτουργίας ουράς είναι O(1)
σωστή απάντηση: σι
Στην επιλογή Β, η μία στοίβα προσομοιώνει την είσοδο στην ουρά και η μία στοίβα προσομοιώνει την αφαίρεση ουράς, το επάνω στοιχείο της προσομοιωμένης στοίβας αναμονής εμφανίζεται απευθείας όταν η στοίβα είναι κενή, εισάγονται όλα τα στοιχεία της προσομοιωμένης στοίβας Είναι απαραίτητο να εισάγετε στοιχεία κάθε φορά, επομένως είναι λάθος.
Στην επιλογή Α, τα χαρακτηριστικά των στοίβων και των ουρών είναι αντίθετα Μια στοίβα δεν μπορεί να υλοποιήσει μια ουρά.
Στην επιλογή Γ, μια στοίβα προσομοιώνει την είσοδο στην ουρά και μια στοίβα προσομοιώνει την έξοδο από την ουρά Κατά την είσοδο στην ουρά, τα στοιχεία αποθηκεύονται απευθείας στη στοίβα που προσομοιώνει την είσοδο στην ουρά.
Στην επιλογή Δ, η ουρά σημαίνει την τοποθέτηση στοιχείων στη στοίβα, οπότε η χρονική πολυπλοκότητα είναι O(1)
Σήμερα μάθαμε για τη δομή δεδομένων μιας στοίβας Δεν είναι πολύ πιο απλή από μια συνδεδεμένη λίστα, ελπίζω αυτό το άρθρο να είναι χρήσιμο για τους φίλους μου.
ικετεύωΚάντε like, αγαπημένο και follow!!!
σας ευχαριστώ όλους! ! !