嵌入式學習第二十八天--棧

棧的基本代碼


棧是限定僅在表尾進行插入和刪除操作的線性表。
先進后出、后進先出


棧頂:允許操作的一端
棧底:不允許操作的一端
入棧,出棧。
順序棧 鏈式棧
30+2\5
1.創建 CreateSeqStack
2.銷毀 DestroySeqStack
3.判斷是否為空棧 IsEmptySeqStack
4.判斷是否為滿棧 IsFullSeqStack
5.壓棧 PushSeqStack
6.出棧 PopSeqStack

seqstack.h

#ifndef __SEQSTACK_H__
#define __SEQSTACK_H__typedef struct person
{char name[32];char sex;int age;int score;
} DATATYPE;typedef struct list
{DATATYPE *head;int tlen;int top; // 相當于clen
} SeqStack;// 創建
SeqStack *CreateSeqStack(int size);
// 銷毀
int DestroySeqStack(SeqStack *ss);
// 新增元素 入棧
int PushSeqStack(SeqStack *ss, DATATYPE *data); // add
// 刪除元素 出棧
int PopSeqStack(SeqStack *ss); // del
// 判斷是否為空
int IsEmpySeqStack(SeqStack *ss);
// 判斷是否為滿
int IsFullSeqStack(SeqStack *ss);
// 獲得棧頂元素
DATATYPE *GetTopSeqStack(SeqStack *ss);
int GetSizeSeqStack(SeqStack *ss);
#endif

seqstack.c


#include "./seqstack.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
// 創建
SeqStack *CreateSeqStack(int size)
{SeqStack *ss = malloc(sizeof(SeqStack));if (NULL == ss){perror("CreateSeqStack malloc error\n");return NULL;}ss->head = malloc(sizeof(DATATYPE) * size);if (NULL == ss->head){perror("CreateSeqStack malloc2 error\n");return NULL;}ss->tlen = size;ss->top = 0;return ss;
}
// 銷毀
int DestroySeqStack(SeqStack *ss)
{if (NULL == ss){fprintf(stderr, "DestroySeqStack pamter error\n");return 1;}free(ss->head);free(ss);return 0;
}
// 新增元素 入棧
int PushSeqStack(SeqStack *ss, DATATYPE *data)
{if (NULL == ss || NULL == data || IsFullSeqStack(ss)){fprintf(stderr, "PushSeqStack pamter error\n");return 1;}memcpy(&ss->head[ss->top], data, sizeof(DATATYPE));ss->top++;return 0;
}
// 刪除元素 出棧
int PopSeqStack(SeqStack *ss)
{if (NULL == ss || IsEmpySeqStack(ss)){fprintf(stderr, "PopSeqStack pamter error\n");return 1;}ss->top--;return 0;
}
// 判斷是否為空
int IsEmpySeqStack(SeqStack *ss)
{return 0 == ss->top;
}
// 判斷是否為滿
int IsFullSeqStack(SeqStack *ss)
{return ss->tlen == ss->top;
}
// 獲得棧頂元素
DATATYPE *GetTopSeqStack(SeqStack *ss)
{if (NULL == ss || IsEmpySeqStack(ss)){fprintf(stderr, "GetTopSeqStack pamter error\n");return NULL;}return &ss->head[ss->top - 1];
}int GetSizeSeqStack(SeqStack *ss)
{if (NULL == ss){fprintf(stderr, "GetSizeSeqStack pamter error\n");return -1;}return ss->top;
}

main.c


#include "./seqstack.h"
#include <stdio.h>int main(int argc, char **argv)
{SeqStack *ss = CreateSeqStack(5);DATATYPE data[] = {{"zhangsan", 'm', 20, 80},{"lisi", 'f', 22, 86},{"wangmazi", 'f', 22, 67},{"guanerge", 'm', 40, 88},{"liubei", 'm', 42, 90},};int i = 0;for (i = 0; i < 5; i++){PushSeqStack(ss, &data[i]);}int len = GetSizeSeqStack(ss);for (i = 0; i < len; i++){DATATYPE *tmp = GetTopSeqStack(ss);printf("name:%s age:%d\n", tmp->name, tmp->age);PopSeqStack(ss);}DestroySeqStack(ss);// system("pause");return 0;
}

練習

遍歷一個文件,查找文件中字符")" ,"]","}"是否存在正確的配對字符,如果不存在,打印錯誤信息,找出錯誤在文件中的第幾行,以及是上面三種字符中的哪種字符導致的錯誤

seqstack.h

#ifndef __SEQSTACK_H__
#define __SEQSTACK_H__typedef struct person
{char sym;int linenum;int colnum;
} DATATYPE;typedef struct list
{DATATYPE *head;int tlen;int top; // 相當于clen
} SeqStack;// 創建
SeqStack *CreateSeqStack(int size);
// 銷毀
int DestroySeqStack(SeqStack *ss);
// 新增元素 入棧
int PushSeqStack(SeqStack *ss, DATATYPE *data); // add
// 刪除元素 出棧
int PopSeqStack(SeqStack *ss); // del
// 判斷是否為空
int IsEmpySeqStack(SeqStack *ss);
// 判斷是否為滿
int IsFullSeqStack(SeqStack *ss);
// 獲得棧頂元素
DATATYPE *GetTopSeqStack(SeqStack *ss);
int GetSizeSeqStack(SeqStack *ss);
#endif

seqstack.c


#include "./seqstack.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
// 創建
SeqStack *CreateSeqStack(int size)
{SeqStack *ss = malloc(sizeof(SeqStack));if (NULL == ss){perror("CreateSeqStack malloc error\n");return NULL;}ss->head = malloc(sizeof(DATATYPE) * size);if (NULL == ss->head){perror("CreateSeqStack malloc2 error\n");return NULL;}ss->tlen = size;ss->top = 0;return ss;
}
// 銷毀
int DestroySeqStack(SeqStack *ss)
{if (NULL == ss){fprintf(stderr, "DestroySeqStack pamter error\n");return 1;}free(ss->head);free(ss);return 0;
}
// 新增元素 入棧
int PushSeqStack(SeqStack *ss, DATATYPE *data)
{if (NULL == ss || NULL == data || IsFullSeqStack(ss)){fprintf(stderr, "PushSeqStack pamter error\n");return 1;}memcpy(&ss->head[ss->top], data, sizeof(DATATYPE));ss->top++;return 0;
}
// 刪除元素 出棧
int PopSeqStack(SeqStack *ss)
{if (NULL == ss || IsEmpySeqStack(ss)){fprintf(stderr, "PopSeqStack pamter error\n");return 1;}ss->top--;return 0;
}
// 判斷是否為空
int IsEmpySeqStack(SeqStack *ss)
{return 0 == ss->top;
}
// 判斷是否為滿
int IsFullSeqStack(SeqStack *ss)
{return ss->tlen == ss->top;
}
// 獲得棧頂元素
DATATYPE *GetTopSeqStack(SeqStack *ss)
{if (NULL == ss || IsEmpySeqStack(ss)){fprintf(stderr, "GetTopSeqStack pamter error\n");return NULL;}return &ss->head[ss->top - 1];
}int GetSizeSeqStack(SeqStack *ss)
{if (NULL == ss){fprintf(stderr, "GetSizeSeqStack pamter error\n");return -1;}return ss->top;
}

main.c

#include "./seqstack.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int do_chekc(char *buf, SeqStack *ss, int num)
{int col = 1;DATATYPE data;while (*buf){DATATYPE *tmp = NULL;bzero(&data, sizeof(data));int c = *buf;switch (c){case '(':case '[':case '{':data.sym = c;data.linenum = num;data.colnum = col;PushSeqStack(ss, &data);break;case ')':tmp = GetTopSeqStack(ss);if (NULL == tmp){printf("read sym:%c ,line:%d col:%d\n", c, num, col);return 1;}if ('(' == tmp->sym){PopSeqStack(ss);}else{printf("read sym:%c ,line:%d col:%d  or top sym:%c ,line:%d col:%d\n", c, num, col, tmp->sym, tmp->linenum, tmp->colnum);return 1;}break;case ']':tmp = GetTopSeqStack(ss);if (NULL == tmp){printf("read sym:%c ,line:%d col:%d\n", c, num, col);return 1;}if ('[' == tmp->sym){PopSeqStack(ss);}else{printf("read sym:%c ,line:%d col:%d  or top sym:%c ,line:%d col:%d\n", c, num, col, tmp->sym, tmp->linenum, tmp->colnum);return 1;}break;case '}':tmp = GetTopSeqStack(ss);if (NULL == tmp){printf("read sym:%c ,line:%d col:%d\n", c, num, col);return 1;}if ('{' == tmp->sym){PopSeqStack(ss);}else{printf("read sym:%c ,line:%d col:%d  or top sym:%c ,line:%d col:%d\n", c, num, col, tmp->sym, tmp->linenum, tmp->colnum);return 1;}break;}buf++;col++;}return 0;
}
int main(int argc, char **argv)
{SeqStack *ss = CreateSeqStack(100);FILE *fp = fopen("./hello.c", "r");if (NULL == fp){perror("fopen");return 1;}int num = 1;int ret = 0;while (1){char buf[256] = {0};if (NULL == fgets(buf, sizeof(buf), fp)){break;}ret = do_chekc(buf, ss, num);if (1 == ret){DestroySeqStack(ss);exit(1);}num++;}if (IsEmpySeqStack(ss)){printf("file ok\n");}else{DATATYPE *tmp = GetTopSeqStack(ss);printf("top sym:%c ,line:%d col:%d\n", tmp->sym, tmp->linenum, tmp->colnum);}DestroySeqStack(ss);// system("pause");return 0;
}

例如創建一個hello.c文件,其中文件少了一個);

運行結果:

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

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

相關文章

MySQL中怎么分析性能?

MySQL中主要有4種方式可以分析數據庫性能&#xff0c;分別是慢查詢日志&#xff0c;profile&#xff0c;Com_xxx和explain。 慢查詢日志 先用下面命令查詢慢查詢日志是否開啟&#xff0c; show variables like slow_query_log;# 一般默認都是以下結果 ---------------------…

大模型在支氣管哮喘手術全流程風險預測與治療方案制定中的應用研究

目錄 一、引言 1.1 研究背景與意義 1.2 研究目標與方法 1.3 研究創新點 二、支氣管哮喘概述 2.1 定義與發病機制 2.2 分類與臨床表現 2.3 診斷標準與方法 三、大模型技術原理與應用現狀 3.1 大模型的基本原理 3.2 在醫療領域的應用案例分析 3.3 適用于支氣管哮喘預…

《AI Agent智能應用從0到1定制開發》學習筆記:使用RAG技術增強大模型能力,實現與各種文檔的對話

思維導圖 &#x1f4da; 引言 大型語言模型&#xff08;如ChatGPT&#xff09;雖然功能強大&#xff0c;但它們存在一些明顯的局限性。這些模型的知識庫更新較慢&#xff0c;無法實時學習最新內容&#xff0c;而且對私有數據或特定領域的專業知識了解有限。例如&#xff0c;Ch…

Python 爬蟲(4)HTTP協議

文章目錄 一、HTTP協議1、HTTP特點2、HTTP工作原理3、HTTP與HTTPS的區別 前言&#xff1a; HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本傳輸協議&#xff09;是互聯網上應用最為廣泛的一種網絡協議&#xff0c;用于在客戶端和服務器之間傳輸超文本&#xf…

測試工程 常用Python庫

以下是測試工程師在Python中必須掌握的常用庫、框架以及提升日常工作效率的技巧總結&#xff1a; 一、必須掌握的Python庫與框架 1. 測試框架 unittest Python內置的單元測試框架&#xff0c;提供測試用例、測試套件、斷言等功能&#xff0c;適合單元測試和集成測試。核心組件…

【線程安全問題的原因和方法】【java形式】【圖片詳解】

在本章節中采用實例圖片的方式&#xff0c;以一個學習者的姿態進行描述問題解決問題&#xff0c;更加清晰明了&#xff0c;以及過程中會發問的問題都會一一進行呈現 目錄 線程安全演示線程不安全情況圖片解釋&#xff1a; 將上述代碼進行修改【從并行轉化成穿行的方式】不會出…

Infinite you:flexible photo recrafting while preserving your identity

基于DiT的id保留圖像生成面臨著多種挑戰,缺乏定制模塊設計,模型擴展的困難以及高質量數據的匱乏,因此基于flux的解決方案是相對稀缺的,pulid-flux是基于flux的id保留的初步嘗試,包括instantx和xlabs-ai的flux.1-dev ip-adapters,現有方法在三個關鍵方面保險不足:1.身份相…

Unity 實現一個簡易可拓展性的對話系統

本人能力有限,一切實現僅供參考,如有不足還請斧正 起因是我看到學校社團內有人做了對話系統的分享,我想了想之前沒寫過這種東西,而Fungus插件教程太老了,NodeCanvas插件學習成本又比較高,我就干脆尋找資料 加上自己迭代一下,花了一天時間完成了這個對話系統 目錄 1.介紹 2.核…

linux常用指令(6)

今天我們繼續學習一些linux常用指令,豐富我們linux基礎知識,那么話不多說,來看. 1.cp指令 功能描述&#xff1a;拷貝文件到指定目錄 基本語法&#xff1a;cp [選項] source dest 常用選項&#xff1a;-r&#xff1a;遞歸復制整個文件夾 拷貝文件&#xff1a; 拷貝文件夾&am…

Vue 3 中的路由傳參詳解※※※※

前言 在Vue應用中&#xff0c;路由傳參是非常常見的需求&#xff0c;它允許我們在不同的組件之間傳遞數據。Vue Router提供了兩種主要的方式來傳遞參數&#xff1a;query參數和params參數。下面我們將詳細探討這兩種傳參方式的使用方法和注意事項。 一、query參數 Query參數…

如何創建一個socket服務器?

1. 導入必要的庫 首先&#xff0c;需要導入Python的socket庫&#xff0c;它提供了創建和管理socket連接的功能。 python import socket 2. 創建服務器端socket 使用socket.socket()函數創建一個服務器端的socket對象&#xff0c;指定協議族&#xff08;如socket.AF_INET表示…

lua垃圾回收

lua垃圾回收 lua 垃圾回收 lua 垃圾回收 collectgarbage(“count”)獲取當前lua腳本占用內存字節數(單位為KB)。 collectgarbage(“collect”)執行一次垃圾回收。 xxxnil 將變量置為空&#xff0c;會釋放內存。 lua中的機制和c#中回收機制很類似 解除羈絆(置為空)。 --垃圾回…

友思特應用 | 行業首創:基于深度學習視覺平臺的AI驅動輪胎檢測自動化

導讀 全球領先的輪胎制造商 NEXEN TIRE 在其輪胎生產檢測過程中使用了基于友思特伙伴Neurocle開發的AI深度學習視覺平臺&#xff0c;實現缺陷檢測率高達99.96%&#xff0c;是該行業首個使用AI平臺技術推動缺陷檢測自動化流程的企業。 將AI應用從輪胎開發擴展到制造過程 2024年…

前后端+數據庫的項目實戰:hbu迎新網-較復雜(下)javaweb

目錄 十一、實現對內容的富文本編輯&#xff08;換行、圖片顏色等等樣式&#xff09; &#xff08;1&#xff09;下載富文本編輯器&#xff0c;引入資源 &#xff08;2&#xff09;將原項目的內容部分替換為富文本編輯器 1、替換添加頁面 2、替換修改頁面&#xff08;和添…

腳本語言 Lua

概念 Lua由標準C編寫而成&#xff0c;幾乎在所有操作系統和平臺上都可以編譯、運行。Lua腳本可以很容易地被C/C 代碼調用&#xff0c;也可以反過來調用C/C的函數&#xff0c;這使得Lua在應用程序中可以被廣泛應用。Lua并沒有提供強大的庫&#xff0c;它是不適合作為開發獨立應…

【數據分享】2000—2024年我國鄉鎮的逐月歸一化植被指數(NDVI)數據(Shp/Excel格式)

之前我們分享過2000—2024年我國省市縣三級逐月歸一化植被指數&#xff08;NDVI&#xff09;數據&#xff0c;該數據是基于NASA定期發布的MOD13A3數據集中的月度NDVI柵格數據&#xff08;可查看之前的文章獲悉詳情&#xff09;計算得出。很多小伙伴拿到數據后反饋是否可以處理出…

【負載均衡系列】HAProxy

HAProxy(High Availability Proxy)是一款高性能的 ?TCP/HTTP 負載均衡器,專注于提供高可用性、靈活性和可靠性。以下是關于HAProxy的詳細解析,涵蓋其工作原理、工作機制、工作模式等核心方面: 一、HAProxy 工作原理 HAProxy的核心職責是將客戶端請求高效、可靠地分發到后…

輕松遷移 Elasticsearch 數據:如何將自建索引導出并導入到另一個實例

概述 在日常的 Elasticsearch 運維和數據管理中&#xff0c;數據遷移是一個常見的需求。無論是為了備份、升級&#xff0c;還是將數據從一個集群遷移到另一個集群&#xff0c;導出和導入索引數據都是至關重要的操作。本文將詳細介紹如何將自建 Elasticsearch 實例中的索引數據…

JVM 類加載器之間的層次關系,以及類加載的委托機制

JVM 類加載器之間存在一種層次關系&#xff0c;通常被稱為雙親委派模型 (Parent Delegation Model)。這種層次關系和委托機制是 Java 類加載機制的核心&#xff0c;對于保證 Java 程序的安全性和避免類沖突至關重要。 1. 類加載器的層次關系: JVM 中的類加載器&#xff08;Cl…

基于 Vue 3 的PDF和Excel導出

以下是基于 Vue 3 Composition API 的完整實現&#xff0c;包括 PDF 和 Excel 導出。 一、PDF 導出 (Vue 3) 安裝依賴 在項目中安裝相關庫&#xff1a; npm install html2canvas jspdf Vue 3 代碼實現 <template><div><div ref"pdfContent" cla…