【數據結構】(C語言):棧

棧:

  • 線性的集合。
  • 后進先出(LIFO,last in first out)。
  • 兩個指針:指向棧頂和棧底。棧頂指向最后進入且第一個出去的元素。棧底指向第一個進入且最后一個出去的元素。
  • 兩個操作:入棧(往棧尾添加元素),出棧(從棧尾取出元素)。
  • 可以使用鏈表實現,也可以使用數組實現。本文使用雙鏈表舉例。

入棧:往棧頂(棧尾部)添加元素。

(頭指針:指向第一個元素。尾指針:指向最后的元素。)

?

出棧:從棧頂(棧尾部)刪除元素。

(頭指針:指向第一個元素。尾指針:指向最后的元素。)


C語言實現(雙鏈表):

創建節點(結構體數據類型),并創建具體節點實例的函數:

// 節點(結構體數據類型)
typedef struct Node
{int value;                  // 存儲數據為整數struct Node *next;          // 指向下一個數據的指針struct Node *prev;          // 指向上一個數據的指針
} LinkNode;                     // 別名LinkNode
// 創建具體節點實例的函數
LinkNode * createNode(int data)
{LinkNode *node = (LinkNode *)malloc(sizeof(LinkNode));     // 分配內存空間if(node == NULL){perror("Memory allocation failed");exit(-1);}node->value = data;node->prev = NULL;node->next = NULL;return node;
}

本文將頭指針、尾指針和棧長度作為全局變量:

LinkNode *header = NULL;    // 頭指針,指向第一個節點,初始化為NULL
LinkNode *tail = NULL;      // 尾指針,指向最后節點,初始化為NULL
int length = 0;             // 統計棧有多少元素,初始化為0

入棧:

// 入棧(往棧頂即尾部添加數據)
void push(int data)
{LinkNode *node = createNode(data);if(length == 0)      // 空棧,頭指針和尾指針都指向新節點{header = node;tail = node;length++;return ;}tail->next = node;           // 原最后節點的下一個為新節點node->prev = tail;           // 新節點的上一個為原最后節點tail = node;                 // 尾指針指向新節點,即新節點為最后節點   length++;                    // 每添加一個元素,length+1
}

獲取棧頂元素:

int gettop(void)
{// 棧不為空,則棧頂元素為尾指針指向的最后節點的值if(length != 0) return tail->value;
}

出棧:

int pop(void)
{if(length != 0){// 獲取最后節點的值int top = tail->value;// 通過最后節點的prev找到倒數第二個節點,其next指向NULL,則原倒數第二個節點為新的最后節點tail->prev->next = NULL;// 每刪除一個節點,length-1length--;// 返回原最后節點的值return top;}
}

遍歷棧:

void travel(void)
{if(length == 0) return ;LinkNode *cur = header;             // 從鏈表頭部開始遍歷,直到最后printf("stack elements:");while(cur != NULL){printf("%d \t", cur->value);cur = cur->next;}printf("\n");
}


完整代碼:(stack.c)

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>/* structrue */
typedef struct Node         // node structure
{int value;struct Node *next;struct Node *prev;
} LinkNode;/* global variables */
LinkNode *header = NULL;    // the header pointer
LinkNode *tail = NULL;      // the tailer pointer
int length = 0;             // the number of the stack elements/* function prototype */
void push(int data);        // add element to the end of the stack
int pop(void);              // delete element from the end of the stack
int gettop(void);           // show element at the end of the stack
void travel(void);          // show element one by one/* main function */
int main(void)
{// cycle input a number until 'q' or non-numeric, add the number to the stackwhile(1)                              // 循環輸入數字,并入棧,輸入q退出輸入循環{int data = 0, c;printf("if quit,input 'q'. Input a number: ");c = getchar();                     // 獲取輸入的一個字符if(tolower(c) == 'q') break;       // 若輸入q,則退出輸入循環if(c < '0' || c > '9') break;      // 輸入的不是數字,則退出輸入循環while(c != '\n')	     // 若整數為多位數,通過一位一位計算最終獲得多位整數{data *= 10;data += c - 48;      // ASCII碼表中,0對應碼值48c = getchar();}push(data);             // 入棧printf("length is %d \n", length);           // 輸出棧元素個數travel();                                    // 遍歷棧}// when stack not empty,cycle look and delete the top element until input 'n'if(length == 0) exit(-1);char k;printf("if you want to look and delete the top element? (y/n) ");scanf(" %c", &k);             // 獲取輸入的內容while(tolower(k) == 'y' && length != 0)          // 循環輸入是否查看并刪除棧頂元素{printf("top element is %d \n", gettop());    // 輸出棧頂元素pop();                                       // 出棧printf("length is %d \n", length);           // 輸出棧元素個數travel();                                    // 遍歷棧printf("if you want to look and delete the top element? (y/n) ");scanf(" %c", &k);                            // 獲取下一個輸入的內容}
}/* subfunction */
LinkNode * createNode(int data)         // create a node
{LinkNode *node = (LinkNode *)malloc(sizeof(LinkNode));if(node == NULL){perror("Memory allocation failed");exit(-1);}node->value = data;node->prev = NULL;node->next = NULL;return node;
}void push(int data)        // add element to the end of the stack
{LinkNode *node = createNode(data);if(length == 0){header = node;tail = node;length++;return ;}tail->next = node;node->prev = tail;tail = node;length++;
}int pop(void)              // delete element from the end of the stack
{if(length != 0){int top = tail->value;tail->prev->next = NULL;length--;return top;}
}int gettop(void)           // show element at the end of the stack
{if(length != 0) return tail->value;
}void travel(void)          // show element one by one
{if(length == 0) return ;LinkNode *cur = header;printf("stack elements:");while(cur != NULL){printf("%d \t", cur->value);cur = cur->next;}printf("\n");
}

?

編譯鏈接: gcc -o stack stack.c

執行可執行文件: ./stack

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/35626.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35626.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/35626.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis服務

目錄 1、介紹 1、redis的特點: 2、緩存 2、安裝Redis 1、安裝單機版redis 2、redis-cli命令參數 3、redis的增刪查改命令 4、redis的相關工具 1、介紹 redis是一個開源的、使用C語言編寫的、支持網絡交互的、可基于內存也可持久化的Key-Value數據庫 redis的官網&…

密碼學及其應用——專用名詞(英語版)

一般術語 1. 密碼學 - cryptography 2. 算法 - algorithm 3. 密碼系統 - cryptosystem 加密和解密 4. 加密 - encryption 5. 解密 - decryption 6. 加密密鑰 - encryption key 7. 解密密鑰 - decryption key 8. 數據加密 - data encryption 9. 流密碼 - stream ciphe…

攝影師危!AI繪畫即將降維打擊攝影行業

你還以為AI繪畫影響的只是插畫師行業嗎&#xff1f;錯了&#xff0c;攝影行業也即將面臨技術洗牌 話不多說&#xff0c;先看一下這幾張圖 你能一眼看出這是AI畫的迪麗熱巴嗎&#xff1f; 你是不是還以為AI繪畫只能畫點動漫藝術風格&#xff1f;那你就低估了AI的發展速度&…

java中 前后端不分離的的方法 如何做api接口請求

在傳統的Java Web開發中&#xff0c;前后端通常是不分離的&#xff0c;即前端頁面和后端API服務是在同一個項目中進行開發和部署的。在這種情況下&#xff0c;我們可以使用Servlet來處理前端的請求&#xff0c;并返回相應的數據。 在本文中&#xff0c;我們將以一個簡單的示例…

react開發嵌入react-monaco-editor代碼編輯器的方法

Next.js中使用react開發嵌入react-monaco-editor代碼編輯器的方法&#xff08;支持語法高亮&#xff09; 安裝 (base) PS D:\ai-ui> npm install react-monaco-editoradded 1 package, changed 1 package, and audited 1030 packages in 6s273 packages are looking for f…

《數字圖像處理》實驗報告五

一、實驗任務與要求 實現一個自適應局部降噪濾波器&#xff1b;在一幅測試版圖像中加入運動模糊和高斯噪聲&#xff0c;產生一幅退化圖像&#xff0c;采用 deconvwnr 函數實現逆濾波及維納濾波。 二、實驗報告 &#xff08;一&#xff09;實現一個自適應局部降噪濾波器 1、自…

ajax請求接口不設置請求頭可以請求成功,但是設置請求頭之后就跨域,已解決

遇到這個問題我們不要著急找后端&#xff0c;先通過控制臺看看有沒有報錯&#xff0c;控制臺的列表是不會有這個紅色報錯的&#xff0c;所以我們要看下圖&#xff1a; 點擊這個紅色&#xff0c;然后在下面會出現一些信息 很明顯是這個請求頭timestamp的請求頭被屏蔽了&#xff…

Linux C語言程序中線程本地存儲變量的內存分配和使用

在多線程中&#xff0c;有一種叫線程本地存儲&#xff08;Thread-Local Storage&#xff0c;TLS&#xff09;的變量&#xff0c;它是每個線程有且只有一份自己的副本&#xff0c;對于這個線程來說&#xff0c;它是全局變量&#xff0c;可被所有函數共用&#xff1b;因為每個線程…

單機、集群和分布式

目錄 1.概述 2.單機服務器 單機版的服務器的性能&#xff0c;設計上的瓶頸&#xff1f; 3.集群 解決瓶頸1&#xff1a; 沒有解決瓶頸2&#xff1a; 沒有解決瓶頸3&#xff1a; 集群的優點&#xff1f; 集群的缺點&#xff1f; 4.分布式 分布式的優點&#xff1f; 分…

c++筆記提高效率-emplace函數

在C中&#xff0c;標準庫容器的emplace方法是一種高效的插入操作&#xff0c;用于在容器中直接構造元素。與insert和push方法相比&#xff0c;emplace方法可以避免不必要的復制或移動操作&#xff0c;因為它直接在容器內部構造元素。下面詳細介紹各容器的emplace方法及其用法。…

java常用類(2)

目錄 1.String概述 1.1 字符串的不變性 1.2 創建String對象兩種方式的區別 1.3 字符串中的構造方法 1.4 字符串判斷功能的方法 1.5 字符串獲取功能的方法 1.6 字符串轉換功能的方法 1.7 字符串替換功能的方法 2.StringBuffer 2.1 構造方法 2.2 插入方法 2.2.1 app…

a-table單元格指定合并以及表格雙擊編輯以及未填寫指定驗證功能

文章目錄 a-table單元格指定合并以及表格雙擊編輯以及未填寫指定驗證功能一、 a-table單元格指定合并1. a-table2. columns3. 圖例 二、a-table 表格雙擊編輯以及未填寫驗證1. a-table2. js3. 圖例 a-table單元格指定合并以及表格雙擊編輯以及未填寫指定驗證功能 一、 a-table…

從零開始精通Onvif之加密與認證

&#x1f4a1; 如果想閱讀最新的文章&#xff0c;或者有技術問題需要交流和溝通&#xff0c;可搜索并關注微信公眾號“希望睿智”。 概述 安全是Onvif規范的核心部分&#xff0c;它涵蓋了加密和認證兩大領域。在Onvif標準下&#xff0c;安全措施主要包括&#xff1a;設備訪問控…

大模型AI技術實現語言規范練習

人工智能技術可以為語言規范練習提供多種有效的解決方案&#xff0c;幫助學習者更有效地掌握語言規范。以下是一些常見的應用場景。北京木奇移動技術有限公司&#xff0c;專業的軟件外包開發公司&#xff0c;歡迎交流合作。 1. 智能糾錯 利用自然語言處理技術&#xff0c;可以…

DC/AC電源模塊一種效率與可靠性兼備的能源轉換解決方案

DC/AC電源模塊都是一種效率與可靠性兼備的能源轉換解決方案 DC/AC電源模塊是一種能夠將直流電源&#xff08;DC&#xff09;轉換為交流電源&#xff08;AC&#xff09;的設備。它在現代電子設備中扮演著非常重要的角色&#xff0c;因為許多設備需要交流電源才能正常運行。無論…

樹形結構的勾選、取消勾選、刪除、清空已選、回顯、禁用

樹形結構的勾選、取消勾選、刪除、清空已選、回顯、禁用 基本頁面&#xff1a; 分為上傳文件和編輯的頁面 代碼實現要點&#xff1a; 上傳文件頁面&#xff1a; 點開選擇范圍彈窗&#xff0c;三個radio單選框都為可選狀態&#xff0c;默認顯示的是第一個單選框&#xff08;按…

開源C++版AI畫圖大模型框架stable-diffusion.cpp開發使用初體驗

stable-diffusion.cpp是一個C編寫的輕量級開源類AIGC大模型框架&#xff0c;可以支持在消費級普通設備上本地部署運行大模型進行AI畫圖&#xff0c;以及作為依賴庫集成的到應用程序中提供類似于網頁版stable-diffusion的功能。 以下基于stable-diffusion.cpp的源碼利用C api來…

人工智能的未來:暢想智能新時代

人工智能正在改變我們的世界&#xff0c;它將帶我們走向何方&#xff1f; 著名神經科學家、Numenta 公司創始人杰夫?霍金斯 Jeff Hawkins 在其著作《人工智能的未來》中&#xff0c;描繪了一幅人工智能發展的光明圖景。他認為&#xff0c;人工智能將超越人類智能&#xff0c;…

理解Gobrs-Async相對于CompletableFuture的優勢

Gobrs-Async框架針對復雜應用場景下的異步任務編排&#xff0c;提供了一些傳統Future或CompletableFuture所不具備的特性和能力&#xff0c;以下是它能夠解決的問題和相對于CompletableFuture的優勢&#xff1a; 1. **全鏈路異常回調**&#xff1a; - Gobrs-Async允許為任務…

關于地圖點擊的操作

_this.map.dragging.disable(); //地圖拖拽 _this.map.doubleClickZoom.disable(); //禁止雙擊放大地圖 _this.map.scrollWheelZoom.disable(); //禁止鼠標滑輪滾動放大縮小地圖 _this.map.dragging.enable(); //e…