主頁 >  其他 > 資料結構之堆疊

資料結構之堆疊

2023-05-16 20:06:58 其他

Stack

型別定義

堆疊是限定僅在表尾進行插入和洗掉操作的線性表,又稱為后進先出(last in first out)的線性表(LIFO結構),表尾稱為堆疊頂,表頭稱為堆疊底,不含元素則稱為空堆疊;
抽象資料型別:

InitStack(&S)               //構造空堆疊S
DestoryStack(&S)            //銷毀堆疊S
ClearStack(&S)              //將S清為空堆疊
StackEmpty(S)               //若S為空堆疊回傳TRUE,否則FALSE
StackLength(S)              //回傳堆疊S的元素個數,即堆疊的長度
GetTop(S, &e)               //用e回傳S的堆疊頂元素
Push(&S, e)                 //插入元素e為新的堆疊頂元素
Pop(&S, &e)                 //洗掉S的堆疊頂元素,并用e回傳其值
StackTraverse(S, visit())   //從堆疊頂到堆疊底依次對S的每個元素呼叫visit(),visit()失敗則操作失敗

順序存盤結構

存盤表示

其中base為NULL時表示堆疊結構不存在,top==base可作為堆疊空的標記;

#define STACK_INIF_SIZE 100  //存盤空間初始分配量
#define STACKINCREMENT 10    //存盤空間分配增量
#define OK 1
#define ERROR 0

typedef int SElemType;
typedef int Status;

typedef struct
{
  SElemType *base;            //堆疊不存在為NULL
  SElemType *top;
  int stacksize;
}SqStack;

基本實作

InitStack

Status InitStack(SqStack *S)
{ // 構造空堆疊S
  S->base = (SElemType *)malloc(STACK_INIF_SIZE * sizeof(SElemType));
  if (!S->base)
    return ERROR;
  S->top = S->base;
  S->stacksize = STACK_INIF_SIZE;
  return OK;
}

GetTop

Status GetTop(SqStack S, SElemType *e)
{ // 若堆疊不空,用e回傳S的堆疊頂元素
  if (S.top == S.base)
    return ERROR;
  (*e) = *(S.top - 1);
  return OK;
}

Push

Status Push(SqStack *S, SElemType e)
{ // 插入元素e為堆疊頂元素
  if (S->top - S->base >= S->stacksize)
  { // 堆疊滿,追加儲存空間
    S->base = (SElemType *)realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(SElemType));
    if (!S->base)
      return ERROR;
    S->top = S->base + S->stacksize;
    S->stacksize += STACKINCREMENT;
  }
  *S->top++ = e;
  return OK;
}

Pop

Status Pop(SqStack *S, SElemType *e)
{ // 若堆疊不空,則洗掉S的堆疊頂元素,并用e回傳其值
  if (S->top == S->base)
    return ERROR;
  (*e) = *--S->top;
  return OK;
}

測驗

int main()
{
  SqStack *S = (SqStack *)malloc(sizeof(SqStack));
  InitStack(S);
  Push(S, 1);
  printf("%d %d\n", *S->base, *(S->top - 1));
  Push(S, 2);
  printf("%d %d\n", *S->base, *(S->top - 1));
  int *e = (int *)malloc(sizeof(int));
  Pop(S, e);
  printf("%d %d\n", *S->base, *(S->top - 1));
  printf("%d", *e);
  return 0;
}

鏈式存盤結構

存盤表示

鏈式存盤便于多個堆疊共享存盤空間以及提高其效率,且不存在堆疊滿的情況,通常采用單鏈表實作,并規定所有操作都是在表頭進行;這里沒有頭結點,直接指向堆疊頂元素,對于空堆疊即top == base = NULL;

//節點
typedef struct StackNode
{ 
  ElemType data;
  struct StackNode *next;
}StackNode, *LinkStackPrt;
//鏈堆疊
typedef struct LinkStack
{
  LinkStackPrt top;
  int count;
}LinkStack;

基本實作

Push

Status Push(LinkStack *S, ElemType e)
{ //插入新堆疊頂元素e
  //創建新節點
  LinkStackPrt p = (LinkStackPrt)malloc(sizeof(StackNode));
  p->data = https://www.cnblogs.com/houchaoqun/p/e;
  p->next = S->top;
  S->top = p;
  S->count++;
  return OK;
}

Pop

Status Pop(LinkStack *S, ElemType *e)
{
  LinkStackPrt P;
  if(StackEmpty(*S))
    return ERROR;
  *e = S->top->data;
  p = S->top;
  S->top = S->top->next;
  free(p);
  S->count--;
  return OK;
}

堆疊的應用

運算式求值

波蘭式(前綴運算式)

從左向右讀入運算式,如果一個運算子后面跟著兩個運算元時,將計算結果作為運算元替換這個運算子和兩個運算元,直至計算完成;
such as 2 + 3 * (5 - 1),其波蘭式為 + 2 * 3 - 5 1;

逆波蘭式(后綴運算式)

相較于波蘭式,逆波蘭式要更為直接,當遇到運算子時,將前面兩個運算元與這個運算子進行計算,結果替換;
如上的 2 + 3 * (5 - 1)用逆波蘭式表示為 2 3 5 1 - * +;
這個程序很容易用堆疊來實作,將2, 3, 5, 1依次壓入堆疊中,當壓入 - 時,判定為運算子,Pop 5, 1,計算結果后再壓入堆疊中,直至壓入完成,堆疊中元素即運算結果;

中綴運算式轉化為逆波蘭式

由于計算機中廣泛應用后綴運算式,因此中綴運算式轉為后綴運算式很有必要;
從左向右遍歷,遇到數字,輸出到逆波蘭式中;遇到符號,判斷其與堆疊頂符號的優先級,是右括號或者優先級低于堆疊頂符號,則堆疊頂元素依次出堆疊并輸出到逆波蘭式中,并將當符號進堆疊,直至輸出結束

如 2 + 3 * (5 - 1)則程序如下:

  • 2,輸出到運算式中,2,堆疊為空;
  • +,到堆疊中,2,+;
  • 3,輸出到運算式中,2 3,+;
  • *,到堆疊中,2 3,+ *;
  • (,到堆疊中,2 3,+ * (;
  • 5,運算式,2 3 5,+ * (;
  • -,堆疊中,2 3 5,+ * ( -;
  • 1,運算式,2 3 5 1,+ * ( -;
  • ),堆疊頂元素依次出堆疊并輸出到運算式中,即2 3 5 1 - * +;

行編輯程式

在堆疊的功能下,實作用戶在終端輸入出現差錯時,及時更正;

堆疊與遞回的實作

……

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/552625.html

標籤:其他

上一篇:程式員不得不了解的計算機進制轉換

下一篇:返回列表

標籤雲
其他(159145) Python(38143) JavaScript(25431) Java(18048) C(15227) 區塊鏈(8267) C#(7972) AI(7469) 爪哇(7425) MySQL(7191) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5340) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4572) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2433) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1975) 功能(1967) Web開發(1951) HtmlCss(1937) python-3.x(1918) C++(1917) 弹簧靴(1913) xml(1889) PostgreSQL(1877) .NETCore(1861) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 資料結構之堆疊

    Stack 型別定義 堆疊是限定僅在表尾進行插入和洗掉操作的線性表,又稱為后進先出(last in first out)的線性表(LIFO結構),表尾稱為堆疊頂,表頭稱為堆疊底,不含元素則稱為空堆疊; 抽象資料型別: InitStack(&S) //構造空堆疊S DestoryStack(&S) //銷毀堆疊S ......

    uj5u.com 2023-05-16 20:06:58 more
  • 程式員不得不了解的計算機進制轉換

    程式員不得不了解的計算機進制轉換 最近在備考軟考的軟體設計師考試,學到了關于計算機的資料表示,由于我是半路出家學的Java,導致計算機基礎知識很差,在這里記錄一下學習感受 為啥要用二進制 早期計算機的存盤介質是晶體管,晶體管根據電壓不同,只能表示2種狀態,也就是0和1 計算機使用二進制運算更加方便 ......

    uj5u.com 2023-05-16 19:53:05 more
  • 4年經驗面試要15K,一問自動化卻以為我在刁難他?

    金3銀4黃金期,我們公司也開始大量招人了,我這次是公司招聘的面試官之一,主要負責一些技術上的考核,這段時間還真讓我碰到了不少奇葩求職者 昨天公司的HR小席剛跟我吐槽:這個星期沒有哪天不加班的!各種招聘網站上的訊息源源不斷,連吃飯都要回訊息…… 看來最近大家跳槽的心都很活躍。之前我向HR要簡歷,他們都 ......

    uj5u.com 2023-05-16 19:27:32 more
  • Windows本地認證之NTML哈希和LM哈希

    Windows本地認證之NTML哈希和LM哈希 一、本地認證的流程 Windows的登陸密碼是儲存在系統本地的SAM檔案中的,在登陸Windows的時候,系統會將用戶輸入的密碼與 SAM檔案中的密碼進行對比,如果相同,則認證成功。 SAM檔案是位于C:\Windows\System32\config ......

    uj5u.com 2023-05-16 19:20:32 more
  • zabbix電話報警技巧

    Zabbix是一款開源的企業級監控系統,可以監控網路、服務器、應用程式等各種資源。在監控程序中,及時的告警通知是非常重要的,本文將介紹如何在Zabbix中配置電話、短信、飛書、釘釘、微信和郵件報警。 前置條件 已經安裝并配置好了Zabbix5以上版本監控系統。 提前下載電話短信報警媒介:https: ......

    uj5u.com 2023-05-16 12:36:36 more
  • 高效聯調,可靠發布!華為云推出CodeArts Release發布管理服務

    摘要:華為云全新推出CodeArts Release發布管理服務,旨在將華為多年形成的發布實踐外溢,幫助企業提升軟體發布質量和效率,降低生產環境的發布風險。 本文分享自華為云社區《高效聯調,可靠發布!華為云推出CodeArts Release發布管理服務》,作者:華為云頭條。 在專案研發迭代的程序中 ......

    uj5u.com 2023-05-16 12:36:19 more
  • Python Numpy 切片和索引(高級索引、布爾索引、花式索引)

    張量(Tensor)、標量(scalar)、向量(vector)、矩陣(matrix) Python Numpy 切片和索引(高級索引、布爾索引、花式索引) Python NumPy 廣播(Broadcast) NumPy(Numerical Python) 是 Python 語言的一個擴展程式庫, ......

    uj5u.com 2023-05-16 12:36:05 more
  • 一種通用的業務監控觸發方案設計

    業務監控是指通過技術手段監控業務代碼執行的最終結果或者狀態是否符合預期,實作業務監控主要分成兩步:一、在業務系統中選擇節點發送訊息觸發業務監控;二、系統在接收到mq訊息或者定時任務調度時,根據訊息中或者任務中的業務資料查詢業務執行的結果或狀態并與業務預期的結果相對比。目前供銷系統的方案如下: ......

    uj5u.com 2023-05-16 12:35:58 more
  • 基于Sentinel自研組件的系統限流、降級、負載保護最佳實踐探索

    作者:京東物流 楊建民 一、Sentinel簡介 Sentinel 以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。 Sentinel 具有以下特征: 豐富的應用場景:秒殺(即突發流量控制在系統容量可以承受的范圍)、訊息削峰填谷、集群流量控制、實時熔斷下游不可用應用等。 ......

    uj5u.com 2023-05-16 12:35:53 more
  • Grafana系列-統一展示-11-Logs Traces無縫跳轉

    系列文章 Grafana 系列文章 概述 如前文 Grafana 系列 - 統一展示 -1- 開篇所述, Grafana 可以了解所有相關的資料--以及它們之間的關系--對于盡快根治事件和確定意外系統行為的真正來源非常重要。Grafana 允許團隊在一個地方對所有的資料進行無縫的可視化和跳轉。 最典 ......

    uj5u.com 2023-05-16 12:35:41 more