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

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

這篇具有很好參考價(jià)值的文章主要介紹了【數(shù)據(jù)結(jié)構(gòu)】 鏈棧的基本操作 (C語(yǔ)言版)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

一、鏈棧

1、鏈棧的定義:

2、鏈棧的優(yōu)缺點(diǎn):

二、鏈棧的基本操作算法(C語(yǔ)言)????

1、宏定義

??2、創(chuàng)建結(jié)構(gòu)體

3、鏈棧的初始化?

?4、鏈棧的進(jìn)棧

5、鏈棧的出棧

6、獲取棧頂元素

7、棧的遍歷輸出

8、鏈棧的判空

?9、求鏈棧的棧長(zhǎng)

10、鏈棧的清空

11、鏈棧的銷毀

三、鏈棧的基本操作完整代碼(C語(yǔ)言)

?四、運(yùn)行結(jié)果


一、鏈棧

1、鏈棧的定義:

鏈棧是一種棧的實(shí)現(xiàn)方式,它使用鏈表結(jié)構(gòu)來(lái)實(shí)現(xiàn)。每個(gè)節(jié)點(diǎn)包含數(shù)據(jù)域和指針域,其中數(shù)據(jù)域用于存儲(chǔ)數(shù)據(jù),指針域用于指向下一個(gè)節(jié)點(diǎn)。鏈棧的棧頂指針指向棧頂元素,棧底指針指向棧底元素。

【數(shù)據(jù)結(jié)構(gòu)】 鏈棧的基本操作 (C語(yǔ)言版),數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言,開(kāi)發(fā)語(yǔ)言,算法

2、鏈棧的優(yōu)缺點(diǎn):

鏈棧的優(yōu)點(diǎn):

  1. 空間利用率高:鏈??梢愿鶕?jù)實(shí)際情況動(dòng)態(tài)調(diào)整棧的大小,避免了順序??赡艹霈F(xiàn)的內(nèi)存溢出等問(wèn)題。
  2. 時(shí)間復(fù)雜度低:鏈棧的入棧和出棧操作只需要改變棧頂指針的指向,時(shí)間復(fù)雜度為O(1),不需要像順序棧一樣進(jìn)行數(shù)據(jù)的移動(dòng),具有比較高的效率。
  3. 方便進(jìn)行動(dòng)態(tài)擴(kuò)展:鏈??梢苑奖愕剡M(jìn)行動(dòng)態(tài)擴(kuò)展,當(dāng)需要增加元素時(shí),可以動(dòng)態(tài)地增加存儲(chǔ)空間;當(dāng)需要減少元素時(shí),可以釋放未使用的空間。

鏈棧的 缺點(diǎn):

  1. 需要額外的指針存儲(chǔ)空間,因此占用的存儲(chǔ)空間較大。
  2. 插入和刪除操作需要修改指針,操作較為復(fù)雜。
  3. 無(wú)法充分利用內(nèi)存的連續(xù)性優(yōu)勢(shì),因?yàn)殒湵砉?jié)點(diǎn)的存儲(chǔ)位置是分散的。

二、鏈棧的基本操作算法(C語(yǔ)言)????

1、宏定義
#define OK 1
#define ERROR 0
#define OVERFLOW -1


typedef int SElemType;
typedef int Status;
??2、創(chuàng)建結(jié)構(gòu)體
//創(chuàng)建結(jié)構(gòu)體
typedef struct StackNode {
    SElemType data;
    struct StackNode *next;
} StackNode, *LinkStack;
3、鏈棧的初始化?
//初始化
Status InitStack(LinkStack &S) {
    S = NULL;
    return OK;
}
?4、鏈棧的進(jìn)棧
//進(jìn)棧
Status Push(LinkStack &S, SElemType e) {//在棧頂插入元素e
    StackNode *p = new StackNode; //生成新結(jié)點(diǎn)
    if (!p) exit(OVERFLOW);

    p->data = e;
    p->next = S; //將新結(jié)點(diǎn)插入  棧頂

    S = p;       //修改棧頂指針為p
    return OK;
}
5、鏈棧的出棧
//出棧
Status Pop(LinkStack &S, int &e) {//刪除S的棧頂元素,用e返回其值
    if (S == NULL) {
        return ERROR;
    }

    e = S->data;      //將棧頂元素賦給e
    LinkStack p = S;            //用p臨時(shí)保存棧頂元素空間,以備釋放
    S = S->next;      //修改棧頂指針
    delete p;
    return OK;
}
6、獲取棧頂元素

//獲取棧頂元素
Status Top(LinkStack &S, int &e) {//刪除S的棧頂元素,用e返回其值
    if (S == NULL) {
        return ERROR;
    }
    e = S->data;      //將棧頂元素賦給e
    return OK;
}
7、棧的遍歷輸出
//棧的遍歷輸出
void StackTraverse(LinkStack S) {
    LinkStack p;  //使用指針p輔助訪問(wèn)棧里元素
    p = S;           //p初始從棧頂開(kāi)始
    printf("從棧頂依次讀出該棧中的元素值為:");
    while (p != NULL) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}
8、鏈棧的判空
//判空
Status stackEmpty(LinkStack S) {
    if (S == NULL) {如果棧頂?shù)闹羔樣蛑赶蚩眨瑒t???        return true;
    } else {
        return false;
    }
}
?9、求鏈棧的棧長(zhǎng)
//求棧長(zhǎng)
Status stackLength(LinkStack S) {
    int len = 0;
    while (S != NULL) {
        len++;
        S = S->next;
    }
    return len;
}
10、鏈棧的清空
//清空
Status ClearStack(LinkStack &S) {
    StackNode *p;
    while (S != NULL) {
        p = S->next;
        delete S;
        S = p;
    }
    return OK;
}
11、鏈棧的銷毀
//銷毀
Status DestoryStack(LinkStack S) {
    StackNode *p;
    while (S) {
        p = S;
        S = S->next;
        delete p;
    }
    S = NULL;
    return OK;
}

三、鏈棧的基本操作完整代碼(C語(yǔ)言)

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

#define OK 1
#define ERROR 0
#define OVERFLOW -1


typedef int SElemType;
typedef int Status;

//創(chuàng)建結(jié)構(gòu)體
typedef struct StackNode {
    SElemType data;
    struct StackNode *next;
} StackNode, *LinkStack;

//初始化
Status InitStack(LinkStack &S) {
    S = NULL;
    return OK;
}

//進(jìn)棧
Status Push(LinkStack &S, SElemType e) {//在棧頂插入元素e
    StackNode *p = new StackNode; //生成新結(jié)點(diǎn)
    if (!p) exit(OVERFLOW);

    p->data = e;
    p->next = S; //將新結(jié)點(diǎn)插入  棧頂

    S = p;       //修改棧頂指針為p
    return OK;
}

//出棧
Status Pop(LinkStack &S, int &e) {//刪除S的棧頂元素,用e返回其值
    if (S == NULL) {
        return ERROR;
    }

    e = S->data;      //將棧頂元素賦給e
    LinkStack p = S;            //用p臨時(shí)保存棧頂元素空間,以備釋放
    S = S->next;      //修改棧頂指針
    delete p;
    return OK;
}

//獲取棧頂元素
Status Top(LinkStack &S, int &e) {//刪除S的棧頂元素,用e返回其值
    if (S == NULL) {
        return ERROR;
    }
    e = S->data;      //將棧頂元素賦給e
    return OK;
}

//獲取棧頂元素
Status GetTop(LinkStack S) {//返回S的棧頂元素,不修改棧頂指針
    if (S != NULL) {
        return S->data;
    }
}

//棧的遍歷輸出
void StackTraverse(LinkStack S) {
    LinkStack p;  //使用指針p輔助訪問(wèn)棧里元素
    p = S;           //p初始從棧頂開(kāi)始
    printf("從棧頂依次讀出該棧中的元素值為:");
    while (p != NULL) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

//判空
Status stackEmpty(LinkStack S) {
    if (S == NULL) {如果棧頂?shù)闹羔樣蛑赶蚩?,則???        return true;
    } else {
        return false;
    }
}

//求棧長(zhǎng)
Status stackLength(LinkStack S) {
    int len = 0;
    while (S != NULL) {
        len++;
        S = S->next;
    }
    return len;
}

//清空
Status ClearStack(LinkStack &S) {
    StackNode *p;
    while (S != NULL) {
        p = S->next;
        delete S;
        S = p;
    }
    return OK;
}

//銷毀
Status DestoryStack(LinkStack S) {
    StackNode *p;
    while (S) {
        p = S;
        S = S->next;
        delete p;
    }
    S = NULL;
    return OK;
}

//功能菜單
int choice() {
    printf("==================================\n");
    printf("         鏈棧操作功能菜單            \n");
    printf("1、進(jìn)棧  2、出棧  3、獲取棧頂元素 \n");
    printf("4、清空  5、銷毀   6、批量進(jìn)棧   \n");
    printf("7、判空           8、鏈棧的長(zhǎng)度 \n");
    printf("9、打印棧內(nèi)元素     10、退出程序 \n");
    printf("==================================\n");
    return 0;
}

int main() {
    LinkStack linkstack;

    //初始化
    Status rInitStack = InitStack(linkstack);
    if (rInitStack == OK) {
        printf("鏈棧初始化成功!\n");
    } else {
        printf("鏈棧初始化失??!\n");
    }

    while (1) {

        //功能菜單
        choice();

        int flag;
        printf("請(qǐng)輸入所需的功能編號(hào):\n");
        scanf("%d", &flag);

        switch (flag) {
            case 1: {//進(jìn)棧
                Status Pushdata;
                printf("請(qǐng)輸入插入元素(請(qǐng)?jiān)谟⑽臓顟B(tài)下輸入例如:1): \n");
                scanf("%d", &Pushdata);
                Status rPush = Push(linkstack, Pushdata);
                if (rPush == OK) {
                    printf("向鏈棧進(jìn)棧%d成功!\n", Pushdata);
                } else {
                    printf("向鏈棧進(jìn)棧失??!\n");
                }
            }
                break;
            case 2: {//出棧
                Status popData;
                Status rPop = Pop(linkstack, popData);
                if (rPop == OK) {
                    printf("向鏈棧出棧%d成功!\n", popData);
                } else {
                    printf("向鏈棧出棧失??!\n");
                }
            }
                break;
            case 3: {//獲取棧頂元素
                Status topData;
                Status rTop = Top(linkstack, topData);
                if (rTop == OK) {
                    printf("向鏈棧獲取棧頂元素:%d\n", topData);
                } else {
                    printf("向鏈棧獲取棧頂元素失敗!\n");
                }
//                //獲取棧頂元素
//                Status rGetTop = GetTop(linkstack);
//                if (rGetTop == OK) {
//                    printf("向鏈棧獲取棧頂元素:%d\n", topData);
//                } else {
//                    printf("向鏈棧獲取棧頂元素失??!\n");
//                }
            }
                break;
            case 4: { //清空
                Status rClearStack = ClearStack(linkstack);
                if (rClearStack == OK) {
                    printf("鏈棧清空成功!\n");
                } else {
                    printf("鏈棧清空失??!\n");
                }
            }
                break;
            case 5: {//銷毀
                Status rDestroyStack = DestoryStack(linkstack);
                if (rDestroyStack == OK) {
                    printf("鏈棧銷毀成功!\n");
                } else {
                    printf("鏈棧銷毀失??!\n");
                }
            }
                break;
            case 6: {//批量插入
                int on;
                printf("請(qǐng)輸入想要插入的元素個(gè)數(shù):\n");
                scanf("%d", &on);
                SElemType array[on];
                for (int i = 1; i <= on; i++) {
                    getchar();
                    printf("向順序棧第%d個(gè)位置插入元素為:", (i));
                    scanf("%d", &array[i]);
                }

                for (int i = 1; i <= on; i++) {
                    Status rPush = Push(linkstack, array[i]);
                    if (rPush == OK) {
                        printf("向鏈棧進(jìn)棧%d成功!\n", array[i]);
                    } else {
                        printf("向鏈棧進(jìn)棧失?。n");
                    }
                }
            }
                break;
            case 7: {//判空
                Status rStackEmpty = stackEmpty(linkstack);
                if (rStackEmpty == true) {
                    printf("鏈棧為空棧!\n\n");
                } else
                    printf("鏈棧不為空!\n\n");
            }
                break;
            case 8: {//鏈棧的長(zhǎng)度
                Status length = stackLength(linkstack);
                printf("鏈棧的長(zhǎng)度為:%d 。\n\n", length);
            }
                break;
            case 9: {  //打印棧內(nèi)元素
                StackTraverse(linkstack);
            }
                break;
            case 10: {//退出程序
                return 0;
            }
                break;
            default: {
                printf("輸入錯(cuò)誤,無(wú)此功能,請(qǐng)檢查輸入:\n\n");
            }
        }
    }

    return 1;
}

?四、運(yùn)行結(jié)果

【數(shù)據(jù)結(jié)構(gòu)】 鏈棧的基本操作 (C語(yǔ)言版),數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言,開(kāi)發(fā)語(yǔ)言,算法

【數(shù)據(jù)結(jié)構(gòu)】 鏈棧的基本操作 (C語(yǔ)言版),數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言,開(kāi)發(fā)語(yǔ)言,算法?

【數(shù)據(jù)結(jié)構(gòu)】 鏈棧的基本操作 (C語(yǔ)言版),數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言,開(kāi)發(fā)語(yǔ)言,算法

【數(shù)據(jù)結(jié)構(gòu)】 鏈棧的基本操作 (C語(yǔ)言版),數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言,開(kāi)發(fā)語(yǔ)言,算法文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-820911.html

到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)】 鏈棧的基本操作 (C語(yǔ)言版)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

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

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

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

    2024年01月24日
    瀏覽(27)
  • 【數(shù)據(jù)結(jié)構(gòu)】棧和隊(duì)列(棧的基本操作和基礎(chǔ)知識(shí))

    【數(shù)據(jù)結(jié)構(gòu)】棧和隊(duì)列(棧的基本操作和基礎(chǔ)知識(shí))

    ??個(gè)人主頁(yè): 秦jh__ https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343 ???系列專欄: 《數(shù)據(jù)結(jié)構(gòu)》 https://blog.csdn.net/qinjh_/category_12536791.html?spm=1001.2014.3001.5482 目錄 ?前言 棧 棧的概念和結(jié)構(gòu) 棧的實(shí)現(xiàn) ?編輯 數(shù)組棧的實(shí)現(xiàn) 總的聲明 初始化 ?插入 刪除 取棧頂元素 銷毀 判斷是否為空

    2024年02月03日
    瀏覽(20)
  • 鏈棧的基本操作(超詳細(xì))

    鏈棧的基本操作(超詳細(xì))

    目錄 前言 一.鏈棧的定義? 二、鏈棧的c++語(yǔ)言結(jié)構(gòu)描述表示 三、鏈棧中基本操作的實(shí)現(xiàn)? 3.1鏈棧的初始化 3.2判斷鏈棧是否為空? 3.3求鏈棧的長(zhǎng)度? 3.4 鏈棧的入棧 3.4 鏈棧的出棧 3.5求棧頂元素? 3.6銷毀棧 四.鏈棧的具體實(shí)現(xiàn)? 五.測(cè)試結(jié)果 六、總結(jié)? 本文參考王卓老師的數(shù)據(jù)結(jié)

    2023年04月25日
    瀏覽(19)
  • 【數(shù)據(jù)結(jié)構(gòu)】順序棧的基本操作:出棧、入棧、取棧頂元素、輸出所有棧中元素、括號(hào)匹配題目

    【數(shù)據(jù)結(jié)構(gòu)】順序棧的基本操作:出棧、入棧、取棧頂元素、輸出所有棧中元素、括號(hào)匹配題目

    棧是限定僅在表位進(jìn)行插入或刪除操作的線性表。棧的表尾稱為棧頂,表頭稱為棧底。不含元素的棧稱為空棧。 左圖為棧的示意圖,右圖為用鐵路調(diào)度表示棧。 如下是入棧至棧滿再進(jìn)行出棧的過(guò)程示意圖。值得注意的是,棧滿后,top指針指向的不是頂端元素,而是頂端的下

    2024年02月07日
    瀏覽(26)
  • 數(shù)據(jù)結(jié)構(gòu):使用順序棧的基本操作,實(shí)現(xiàn)十進(jìn)制轉(zhuǎn)為二進(jìn)制,十六進(jìn)制的轉(zhuǎn)換

    使用系統(tǒng)環(huán)境: 1:win10,使用工具dev 2:使用系統(tǒng)win10 3:參考書(shū)籍?dāng)?shù)據(jù)結(jié)構(gòu)(C語(yǔ)言版——嚴(yán)蔚敏 吳偉民) ( 注意:此文章默認(rèn),學(xué)習(xí)者擁有一定的數(shù)據(jù)機(jī)構(gòu)棧,C語(yǔ)言的知識(shí),書(shū)籍第20頁(yè),2.1算法的代碼進(jìn)行一個(gè)簡(jiǎn)化。)

    2024年02月05日
    瀏覽(31)
  • 【數(shù)據(jù)結(jié)構(gòu)】圖的基本操作

    【數(shù)據(jù)結(jié)構(gòu)】圖的基本操作

    一、問(wèn)題描述 分別以鄰接矩陣和鄰接表作為存儲(chǔ)結(jié)構(gòu),實(shí)現(xiàn)以下圖的基本操作: 增加一個(gè)新結(jié)點(diǎn)v,Insert(G,v); 刪除頂點(diǎn)v及其相關(guān)的邊,Delete(G,v); 增加一條邊v,w,Insert(G,v,w); 刪除一條邊v,w,Delete(G,v,w); 二、設(shè)計(jì)思路 1、鄰接矩陣實(shí)現(xiàn): ????????鄰接矩陣實(shí)現(xiàn)圖的基本

    2024年02月06日
    瀏覽(21)
  • 數(shù)據(jù)結(jié)構(gòu)--串的基本操作

    數(shù)據(jù)結(jié)構(gòu)--串的基本操作

    第五話 數(shù)據(jù)結(jié)構(gòu)之串 文章目錄 一、了解什么是串 二、串的基本特征 三、串的基本操作 串的初始化 串的輸出? 四、串的匹配模式 五、總結(jié) 串(即字符串)是一種特殊的線性表,在信息檢索、文本編輯等領(lǐng)域有廣泛的應(yīng)用。其特殊性體現(xiàn)在組成線性表的每個(gè)數(shù)據(jù)元素是單個(gè)

    2023年04月17日
    瀏覽(31)
  • 數(shù)據(jù)結(jié)構(gòu)--圖的基本操作

    數(shù)據(jù)結(jié)構(gòu)--圖的基本操作

    使用的存儲(chǔ)模式: 圖的基本操作: ? Adjacent(G,x,y):判斷圖G是否存在邊x, y或(x, y)。 ? Neighbors(G,x):列出圖G中與結(jié)點(diǎn)x鄰接的邊。 ? InsertVertex(G,x):在圖G中插入頂點(diǎn)x。 ? DeleteVertex(G,x):從圖G中刪除頂點(diǎn)x。 ? AddEdge(G,x,y):若無(wú)向邊(x, y)或有向邊x, y不存在,則向圖G中添加該

    2024年02月16日
    瀏覽(29)
  • 【數(shù)據(jù)結(jié)構(gòu)】串的基本操作及應(yīng)用

    【數(shù)據(jù)結(jié)構(gòu)】串的基本操作及應(yīng)用

    分別定義兩個(gè)結(jié)構(gòu)體——串的定長(zhǎng)順序存儲(chǔ)、串的堆式順序存儲(chǔ) ? 問(wèn)題: 1、編寫(xiě)函數(shù),串用定長(zhǎng)順序存儲(chǔ)表示來(lái)實(shí)現(xiàn)串的基本操作; 2、?編寫(xiě)串的匹配算法,實(shí)現(xiàn)查找功能。 算法思想闡述: BF 算法:首先S[1] 和T[1] 比較,若相等,則再比較S[2] 和T[2] ,一直到T[M] 為止;若

    2023年04月26日
    瀏覽(27)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包