国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【數(shù)據(jù)結(jié)構(gòu)】線性表(六)堆棧:順序棧及其基本操作(初始化、判空、判滿、入棧、出棧、存取棧頂元素、清空棧)

這篇具有很好參考價值的文章主要介紹了【數(shù)據(jù)結(jié)構(gòu)】線性表(六)堆棧:順序棧及其基本操作(初始化、判空、判滿、入棧、出棧、存取棧頂元素、清空棧)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

??堆棧Stack 和 隊列Queue是兩種非常重要的數(shù)據(jù)結(jié)構(gòu),兩者都是特殊的線性表:

  • 對于堆棧,所有的插入和刪除(以至幾乎所有的存取)都是在表的同一端進行
  • 對于隊列,所有的插入都是在表的一端進行,所有的刪除(以至幾乎所有的存?。┒际窃诒淼牧硪欢诉M行。

一、堆棧

1. 定義

??堆棧(簡稱)是一種操作受限的線性表,只允許在表的同一端進行插入和刪除操作,且這些操作是按后進先出的原則進行的。進行插入和刪除的一端被稱為棧頂,另一端被稱為棧底。當棧中無元素時稱其為空棧。根據(jù)上述定義,每次刪除(退棧)的總是最后插入(進棧)的元素。

【數(shù)據(jù)結(jié)構(gòu)】線性表(六)堆棧:順序棧及其基本操作(初始化、判空、判滿、入棧、出棧、存取棧頂元素、清空棧),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c語言,鏈表
??如圖所示的堆棧中,諸元素以a1,a2,a3,a4,a5的順序進棧,而退棧的次序則是a5,a4,a3,a2,a1。 也就是說,從棧中取走元素是按后進先出的原則進行的,因此棧又被稱作后進先出(Last in First Out)的線性表,簡稱為LIFO表。

2. 基本操作

  • 堆棧是受限的線性表,其基本操作包括
    • push ( ) : 壓入一個元素(插入);
    • pop ( ) : 彈出一個元素(刪除);
    • peek ( ) : 存取棧頂元素值;
    • clear ( ) : 清空棧;
    • IsEmpty ( ) : 判斷棧是否為空;
  • 同普通線性表一樣,堆棧也可以用順序存儲和鏈接存儲兩種方式來實現(xiàn):

二、順序棧

??用順序存儲方式實現(xiàn)的堆棧稱為順序棧。

  • 順序棧用數(shù)組存放棧元素,可方便地進行各種棧操作;
  • 某一堆棧的規(guī)模指該堆棧最多能容納的元素個數(shù);
  • 存放堆棧的數(shù)組規(guī)模(或大?。?yīng)按堆棧的規(guī)模來確定:
    • 當堆棧中元素的個數(shù)達到堆棧規(guī)模(簡稱為棧滿)時,則無法再向堆棧插入元素,換言之此時的插入操作將產(chǎn)生上溢出。
  • 如何確保既不上溢也不下溢?
    • 需要一個整型變量size來存放數(shù)組規(guī)模,以及一個整型變量top來存放棧頂元素在數(shù)組中的位置(下標)
      • 當棧為空時,top值為0
      • 每入棧(或出棧)一個元素,top值加1(或減1)
      • 當top等于size時,說明棧滿

0. 順序表

參考前文:順序表及其基本操作

1. 頭文件和常量

   #include <stdio.h>
   #include <stdlib.h>

   #define MAX_SIZE 100
  • 兩個頭文件
    • stdio.h用于輸入輸出操作
    • stdlib.h用于內(nèi)存分配和釋放
  • 通過#define指令定義了一個常量MAX_SIZE,它表示棧的最大容量為100。

2. 棧結(jié)構(gòu)體

   typedef struct {
       int data[MAX_SIZE];
       int top;
   } Stack;

??使用結(jié)構(gòu)體定義了一個棧的數(shù)據(jù)結(jié)構(gòu),data是一個整型數(shù)組,用于存儲棧中的元素,top表示棧頂?shù)乃饕?/p>

3. 棧的初始化

   void init(Stack* stack) {
       stack->top = -1;
   }

??初始化棧,將棧頂索引top置為-1,表示棧為空。

4. 判斷棧是否為空

   int isEmpty(Stack* stack) {
       return stack->top == -1;
   }

??判斷棧是否為空,如果棧頂索引top等于-1,表示棧為空,函數(shù)返回1;否則,返回0。

5. 判斷棧是否已滿

   int isFull(Stack* stack) {
       return stack->top == MAX_SIZE - 1;
   }

??isFull函數(shù)用于判斷棧是否已滿,如果棧頂索引top等于MAX_SIZE - 1,表示棧已滿,函數(shù)返回1;否則,返回0。

6. 入棧

   void push(Stack* stack, int value) {
       if (isFull(stack)) {
           printf("Stack is full. Cannot push element.\n");
           return;
       }
       stack->data[++stack->top] = value;
   }

??push函數(shù)用于將元素入棧,首先判斷棧是否已滿,如果已滿,則打印錯誤信息并返回;否則,將元素存儲在棧頂索引top的位置,并將棧頂索引加1。

7. 出棧

   int pop(Stack* stack) {
       if (isEmpty(stack)) {
           printf("Stack is empty. Cannot pop element.\n");
           return -1;
       }
       return stack->data[stack->top--];
   }

??pop函數(shù)用于將棧頂元素出棧,首先判斷棧是否為空,如果為空,則打印錯誤信息并返回-1;否則,返回棧頂元素的值,并將棧頂索引減1。

8. 查看棧頂元素

   int peek(Stack* stack) {
       if (isEmpty(stack)) {
           printf("Stack is empty. Cannot peek element.\n");
           return -1;
       }
       return stack->data[stack->top];
   }

??peek函數(shù)用于查看棧頂元素的值,首先判斷棧是否為空,如果為空,則打印錯誤信息并返回-1;否則,返回棧頂元素的值。

9. 清空棧

   void clear(Stack* stack) {
       stack->top = -1;
   }

??clear函數(shù)用于清空棧,將棧頂索引top置為-1,表示棧為空。

10. 主函數(shù)

int main() {
    Stack stack;
    init(&stack);

    push(&stack, 10);
    push(&stack, 20);
    push(&stack, 30);

    printf("Top element: %d\n", peek(&stack));

    printf("Popped element: %d\n", pop(&stack));
    printf("Popped element: %d\n", pop(&stack));

    printf("Is stack empty? %s\n", isEmpty(&stack) ? "Yes" : "No");

    clear(&stack);

    printf("Is stack empty? %s\n", isEmpty(&stack) ? "Yes" : "No");

    return 0;
}
  • 聲明一個Stack類型的變量stack,然后調(diào)用init函數(shù)對棧進行初始化。

  • 使用push函數(shù)將元素10、20和30依次入棧。

  • 使用peek函數(shù)查看棧頂元素的值。

  • 使用pop函數(shù)將棧頂?shù)膬蓚€元素出棧。

  • 使用isEmpty函數(shù)判斷棧是否為空。

  • 調(diào)用clear函數(shù)清空棧。

  • 再次使用isEmpty函數(shù)判斷棧是否為空。

【數(shù)據(jù)結(jié)構(gòu)】線性表(六)堆棧:順序棧及其基本操作(初始化、判空、判滿、入棧、出棧、存取棧頂元素、清空棧),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c語言,鏈表文章來源地址http://www.zghlxwxcb.cn/news/detail-722378.html

11. 代碼整合

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100

typedef struct {
    int data[MAX_SIZE];
    int top;
} Stack;

void init(Stack* stack) {
    stack->top = -1;
}

int isEmpty(Stack* stack) {
    return stack->top == -1;
}

int isFull(Stack* stack) {
    return stack->top == MAX_SIZE - 1;
}

void push(Stack* stack, int value) {
    if (isFull(stack)) {
        printf("Stack is full. Cannot push element.\n");
        return;
    }
    stack->data[++stack->top] = value;
}

int pop(Stack* stack) {
    if (isEmpty(stack)) {
        printf("Stack is empty. Cannot pop element.\n");
        return -1;
    }
    return stack->data[stack->top--];
}

int peek(Stack* stack) {
    if (isEmpty(stack)) {
        printf("Stack is empty. Cannot peek element.\n");
        return -1;
    }
    return stack->data[stack->top];
}

void clear(Stack* stack) {
    stack->top = -1;
}

int main() {
    Stack stack;
    init(&stack);

    push(&stack, 10);
    push(&stack, 20);
    push(&stack, 30);

    printf("Top element: %d\n", peek(&stack));

    printf("Popped element: %d\n", pop(&stack));
    printf("Popped element: %d\n", pop(&stack));

    printf("Is stack empty? %s\n", isEmpty(&stack) ? "Yes" : "No");

    clear(&stack);

    printf("Is stack empty? %s\n", isEmpty(&stack) ? "Yes" : "No");

    return 0;
}

到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)】線性表(六)堆棧:順序棧及其基本操作(初始化、判空、判滿、入棧、出棧、存取棧頂元素、清空棧)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【Java】實現(xiàn)順序表基本的操作(數(shù)據(jù)結(jié)構(gòu))

    【Java】實現(xiàn)順序表基本的操作(數(shù)據(jù)結(jié)構(gòu))

    在了解順序表之前我們要先了解什么是線性表,線性表(linear list)是n個具有相同特性的數(shù)據(jù)元素的有限序列。 線性表是一種在實際中廣泛使用的數(shù)據(jù)結(jié)構(gòu),常見的線性表:順序表、鏈表、棧、隊列… 線性表在邏輯上是線性結(jié)構(gòu),也就說是連續(xù)的一條直線。但是在物理結(jié)構(gòu)

    2024年02月03日
    瀏覽(17)
  • 【數(shù)據(jù)結(jié)構(gòu)】順序表基本操作的實現(xiàn)(C語言)

    【數(shù)據(jù)結(jié)構(gòu)】順序表基本操作的實現(xiàn)(C語言)

    ?? 作者簡介:一名在后端領(lǐng)域?qū)W習(xí),并渴望能夠?qū)W有所成的追夢人。 ?? 個人主頁:蝸牛牛啊 ?? 系列專欄:??數(shù)據(jù)結(jié)構(gòu)、??C++ ?? 學(xué)習(xí)格言:博觀而約取,厚積而薄發(fā) ?? 歡迎進來的小伙伴,如果小伙伴們在學(xué)習(xí)的過程中,發(fā)現(xiàn)有需要糾正的地方,煩請指正,希望能夠與

    2024年02月16日
    瀏覽(24)
  • 數(shù)據(jù)結(jié)構(gòu)教程實驗一順序表基本操作的實現(xiàn)

    數(shù)據(jù)結(jié)構(gòu)教程實驗一順序表基本操作的實現(xiàn)

    1.掌握線性表的順序存貯結(jié)構(gòu)及基本操作,深入了解順序表的基本特性,以便在實際問題背景下靈活運用它們。 2.深入理解和靈活掌握順序表的插入、刪除等操作。 1.硬件:每個學(xué)生需配備計算機一臺。 2.軟件:Windows操作系統(tǒng)+Visual C++。 ????1.將建表、遍歷、插入、刪除分別

    2024年02月07日
    瀏覽(26)
  • 【數(shù)據(jù)結(jié)構(gòu)】 順序棧的基本操作 (C語言版)

    【數(shù)據(jù)結(jié)構(gòu)】 順序棧的基本操作 (C語言版)

    目錄 一、順序棧 1、順序棧的定義: 2、順序棧的優(yōu)缺點 二、順序棧的基本操作算法(C語言)??? 1、宏定義 ?2、創(chuàng)建結(jié)構(gòu)體 3、順序棧的初始化? 4、順序棧的入棧 5、順序棧的出棧 6、取棧頂元素 7、棧的遍歷輸出 8、順序棧的判空 9、順序棧的判滿 ?10、求順序棧長度 11、順

    2024年01月24日
    瀏覽(27)
  • 數(shù)據(jù)結(jié)構(gòu):線性表順序存儲結(jié)構(gòu)———順序表

    目錄 順序表的定義 初始化線性表 銷毀線性表 求線性表的長度 判斷是否為空表 插入數(shù)據(jù)元素 邏輯序號與物理序號的區(qū)別 刪除數(shù)據(jù)元素 輸出線性表 ?按序號求線性表中的元素 按元素值查找 整體上創(chuàng)建順序表 順序表實驗 線性表的順序存儲是把線性表中的所有元素按照其邏輯

    2024年02月03日
    瀏覽(25)
  • 基于C語言的數(shù)據(jù)結(jié)構(gòu)之順序表——帶你熟練掌握順序表基本操作!!超級詳細!!

    目錄 前言: 1.源代碼如下 2.數(shù)據(jù)結(jié)構(gòu)——順序表 ? ?2.1.順序表的特點 ? ?2.2順序表的分類 ? ??2.2.1.動態(tài)分配內(nèi)存的順序表 ? ??2.2.2.靜態(tài)分配內(nèi)存的順序表 ? ?2.3.定義一個順序表 3.順序表的基本操作 ? ?3.1初始化順序表 ? ??不用將順序表中可能存在的原有元素初始化嗎?

    2024年04月26日
    瀏覽(20)
  • 【玩轉(zhuǎn)408數(shù)據(jù)結(jié)構(gòu)】線性表——定義和基本操作

    【玩轉(zhuǎn)408數(shù)據(jù)結(jié)構(gòu)】線性表——定義和基本操作

    ????????線性表是算法題命題的重點,該類題目實現(xiàn)相對容易且代碼量不高,但需要最優(yōu)的性能(也就是其時間復(fù)雜度以及空間復(fù)雜度最優(yōu)),這樣才可以獲得滿分。所以在考研復(fù)習(xí)中,我們需要掌握線性表的基本操作,在平時多進行代碼練習(xí)。當然在考場上,我們并不一

    2024年02月19日
    瀏覽(22)
  • 數(shù)據(jù)結(jié)構(gòu):定長順序串(SString)基本操作的算法描述(C語言)

    作者在學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)時,發(fā)現(xiàn)鮮有完全按照 C 語言描述的算法操作,這讓習(xí)慣于寫 .c 而不是 .cpp 的初學(xué)者很是頭疼。本文將基于 C 語言描述算法操作,如有錯漏還望大佬們指正。 本文將按照嚴惠敏所著《數(shù)據(jù)結(jié)構(gòu)(C語言版)》所做的函數(shù)原型聲明進行算法描述,由于C語言不支

    2024年02月07日
    瀏覽(33)
  • 【數(shù)據(jù)結(jié)構(gòu)】線性結(jié)構(gòu) 之 順序表

    【數(shù)據(jù)結(jié)構(gòu)】線性結(jié)構(gòu) 之 順序表

    ??博客主頁:大寄一場. ??系列專欄:數(shù)據(jù)結(jié)構(gòu)與算法 ??博客制作不易歡迎各位??點贊+?收藏+?關(guān)注 目錄 前言 順序表概念及結(jié)構(gòu) 靜態(tài)代碼實現(xiàn): 動態(tài)代碼實現(xiàn): SeqList.h文件 SeqList.c文件 test.c文件 本章節(jié)博主將會帶領(lǐng)大家了解數(shù)據(jù)結(jié)構(gòu)的 線性結(jié)構(gòu)的順序表 。 提到線性

    2024年02月06日
    瀏覽(28)
  • c語言數(shù)據(jù)結(jié)構(gòu)——鏈表的實現(xiàn)及其基本操作

    c語言數(shù)據(jù)結(jié)構(gòu)——鏈表的實現(xiàn)及其基本操作

    順序表的問題及思考 問題: 中間/頭部的插入刪除,時間復(fù)雜度為O(N) 增容需要申請新空間,拷貝數(shù)據(jù),釋放舊空間。會有不小的消耗。 增容一般是呈2倍的增長,勢必會有一定的空間浪費。例如當前容量為100,滿了以后增容到 200,我們再繼續(xù)插入了5個數(shù)據(jù),后面沒有數(shù)據(jù)插

    2023年04月09日
    瀏覽(96)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包