初階數據結構:棧與隊列的擴展補充

目錄

  • 1. 棧與隊列練習題
    • 1.1 棧的括號匹配問題
    • 1.2 用隊列來實現棧
    • 1.3 用棧來實現隊列
    • 1.4 擴展:循環隊列

1. 棧與隊列練習題

1.1 棧的括號匹配問題

  1. 題目信息:
    在這里插入圖片描述
  2. 題目鏈接:
    括號匹配問題

思路: 利用棧的后進先出特性來實現括號的匹配

  1. 當遇到 ‘(’,‘{’,‘[’,這三種括號時進行壓棧
  2. 當遇到’)‘,’}‘,’]',這三種括號時將括號中的元素進行出棧匹配

過程演示:

在這里插入圖片描述

typedef char STDataType;
typedef struct Stack
{STDataType* _a;int _top; // 棧頂int _capacity; // 容量
}Stack;void CheckCapacity(Stack* ps)
{if (ps->_capacity == ps->_top){int newcapacity = ps->_capacity == 0 ? 4 : 2 * ps->_capacity;STDataType* data = (STDataType*)realloc(ps->_a, newcapacity * sizeof(STDataType));if (data == NULL){perror("realloc failed");exit(-1);}ps->_a = data;ps->_capacity = newcapacity;}
}void StackInit(Stack* ps)
{ps->_capacity = 0;ps->_top = 0;ps->_a = NULL;CheckCapacity(ps);
}void StackPush(Stack* ps, STDataType data)
{assert(ps);CheckCapacity(ps);ps->_a[ps->_top] = data;ps->_top++;
}int StackEmpty(Stack* ps)
{assert(ps);return ps->_top == 0;
}void StackPop(Stack* ps)
{assert(!StackEmpty(ps));ps->_top--;
}STDataType StackTop(Stack* ps)
{assert(ps);assert(!StackEmpty(ps));return ps->_a[ps->_top - 1];
}int StackSize(Stack* ps)
{assert(ps);return ps->_top;
}void StackDestroy(Stack* ps)
{assert(ps);free(ps->_a);ps->_capacity = ps->_top = 0;
}bool isValid(char* s) 
{Stack st1;StackInit(&st1);int i = 0;for(i = 0; s[i] != '\0'; i++){if(s[i] == '(' || s[i] == '[' || s[i] == '{'){StackPush(&st1, s[i]);}else if(s[i] == ')' || s[i] == ']' || s[i] == '}'){if(StackEmpty(&st1)){return false;}char tmp = StackTop(&st1);if(s[i] == ')' && tmp == '('){StackPop(&st1);}else if(s[i] == ']' && tmp == '['){StackPop(&st1);}else if(s[i] == '}' && tmp == '{'){StackPop(&st1);}else{break;}}}if(StackEmpty(&st1)){return true;}return false;      
}

1.2 用隊列來實現棧

  1. 題目信息:
    在這里插入圖片描述
  2. 題目鏈接:
    用兩個隊列實現棧

在這里插入圖片描述

myStack結構:
在這里插入圖片描述

typedef int QDataType;typedef struct QListNode
{struct QListNode* _pNext;QDataType _data;
}QNode;typedef struct Queue
{QNode* _front;QNode* _rear;
}Queue;void QueueInit(Queue* q)
{assert(q);q->_front = q->_rear = NULL;
}QNode* BuyNewNode2(QDataType data)
{QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc failed");exit(-1);}newnode->_data = data;newnode->_pNext = NULL;return newnode;
}void QueuePush(Queue* q, QDataType data)
{assert(q);QNode* newnode = BuyNewNode2(data);if (q->_front == NULL){q->_front = q->_rear = newnode;}else{q->_rear->_pNext = newnode;q->_rear = q->_rear->_pNext;}
}int QueueEmpty(Queue* q)
{assert(q);return q->_front == NULL;
}void QueuePop(Queue* q)
{assert(q);assert(!QueueEmpty(q));QNode* cur = q->_front->_pNext;free(q->_front);q->_front = cur;if (q->_front == NULL){q->_rear = NULL;}
}QDataType QueueFront(Queue* q)
{assert(q);assert(!QueueEmpty(q));return q->_front->_data;
}QDataType QueueBack(Queue* q)
{assert(q);assert(!QueueEmpty(q));return q->_rear->_data;
}int QueueSize(Queue* q)
{assert(q);int count = 0;QNode* cur = q->_front;while (cur){cur = cur->_pNext;count++;}return count;
}void QueueDestroy(Queue* q)
{assert(q);while (q->_front){QueuePop(q);}
}typedef struct MyStack
{Queue q1;Queue q2;
} MyStack;MyStack* myStackCreate()
{MyStack* obj = (MyStack*)malloc(sizeof(MyStack));QueueInit(&obj->q1);QueueInit(&obj->q2);return obj;
}void myStackPush(MyStack* obj, int x)
{assert(obj);Queue* no_empty = &obj->q1;if (QueueEmpty(&obj->q1)){no_empty = &obj->q2;}QueuePush(no_empty, x);
}bool myStackEmpty(MyStack* obj)
{assert(obj);return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);
}int myStackTop(MyStack* obj)
{assert(obj);assert(!myStackEmpty(obj));Queue* no_empty = &obj->q1;if (QueueEmpty(&obj->q1)){no_empty = &obj->q2;}return QueueBack(no_empty);
}int myStackPop(MyStack* obj)
{Queue* no_empty = &obj->q1;Queue* empty = &obj->q2;if (QueueEmpty(&obj->q1)){no_empty = &obj->q2;empty = &obj->q1;}while (QueueSize(no_empty) > 1){QueuePush(empty, QueueFront(no_empty));QueuePop(no_empty);}int val = QueueFront(no_empty);QueuePop(no_empty);return val;
}void myStackFree(MyStack* obj)
{assert(obj);Queue* no_empty = &obj->q1;if (QueueEmpty(&obj->q1)){no_empty = &obj->q2;}QueueDestroy(no_empty);free(obj);
}

1.3 用棧來實現隊列

  1. 題目信息:
    在這里插入圖片描述
  2. 題目鏈接:
    用棧實現隊列

過程演示:
在這里插入圖片描述

typedef char STDataType;
typedef struct Stack
{STDataType* _a;int _top; // 棧頂int _capacity; // 容量
}Stack;void CheckCapacity(Stack* ps)
{if (ps->_capacity == ps->_top){int newcapacity = ps->_capacity == 0 ? 4 : 2 * ps->_capacity;STDataType* data = (STDataType*)realloc(ps->_a, newcapacity * sizeof(STDataType));if (data == NULL){perror("realloc failed");exit(-1);}ps->_a = data;ps->_capacity = newcapacity;}
}void StackInit(Stack* ps)
{ps->_capacity = 0;ps->_top = 0;ps->_a = NULL;CheckCapacity(ps);
}void StackPush(Stack* ps, STDataType data)
{assert(ps);CheckCapacity(ps);ps->_a[ps->_top] = data;ps->_top++;
}int StackEmpty(Stack* ps)
{assert(ps);return ps->_top == 0;
}void StackPop(Stack* ps)
{assert(!StackEmpty(ps));ps->_top--;
}STDataType StackTop(Stack* ps)
{assert(ps);assert(!StackEmpty(ps));return ps->_a[ps->_top - 1];
}int StackSize(Stack* ps)
{assert(ps);return ps->_top;
}void StackDestroy(Stack* ps)
{assert(ps);free(ps->_a);ps->_capacity = ps->_top = 0;
}typedef struct 
{Stack push_stack;Stack pop_stack;    
} MyQueue;MyQueue* myQueueCreate() 
{MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));StackInit(&obj->push_stack);StackInit(&obj->pop_stack);return obj;    
}void myQueuePush(MyQueue* obj, int x) 
{assert(obj);StackPush(&obj->push_stack, x);    
}bool myQueueEmpty(MyQueue* obj) 
{assert(obj);return StackEmpty(&obj->push_stack) && StackEmpty(&obj->pop_stack);
}int myQueuePeek(MyQueue* obj) 
{assert(obj);assert(!myQueueEmpty(obj));if(StackEmpty(&obj->pop_stack)){while(!StackEmpty(&obj->push_stack)){StackPush(&obj->pop_stack, StackTop(&obj->push_stack));StackPop(&obj->push_stack);}}return StackTop(&obj->pop_stack);
}int myQueuePop(MyQueue* obj) 
{assert(obj);assert(!myQueueEmpty(obj));int data = myQueuePeek(obj);StackPop(&obj->pop_stack);return data;
}void myQueueFree(MyQueue* obj) 
{assert(obj);StackDestroy(&obj->push_stack);StackDestroy(&obj->pop_stack);free(obj);    
}

1.4 擴展:循環隊列

  1. 題目信息:
    在這里插入圖片描述
  2. 題目鏈接:
    循環鏈表

過程演示:
在這里插入圖片描述

typedef struct
{int* data;int c_front;int c_rear;int capacity_k;
} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k)
{MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));//k + 1為構建循環鏈表所需的空間大小obj->data = (int*)malloc((k + 1) * sizeof(int));//注:k為能夠存儲的元素個數,即鏈表存儲數據的容量obj->capacity_k = k;obj->c_front = obj->c_rear = 0;return obj;
}bool myCircularQueueIsFull(MyCircularQueue* obj)
{assert(obj);int k = obj->capacity_k;return obj->c_front % (k + 1) == (obj->c_rear + 1) % (k + 1);
}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value)
{assert(obj);int k = obj->capacity_k;if (!myCircularQueueIsFull(obj)){int rear = obj->c_rear % (k + 1);obj->data[rear] = value;obj->c_rear++;return true;}return false;
}bool myCircularQueueIsEmpty(MyCircularQueue* obj)
{assert(obj);int k = obj->capacity_k;return obj->c_front % (k + 1) == obj->c_rear % (k + 1);
}bool myCircularQueueDeQueue(MyCircularQueue* obj)
{assert(obj);if (!myCircularQueueIsEmpty(obj)){obj->c_front++;return true;}return false;
}int myCircularQueueFront(MyCircularQueue* obj)
{assert(obj);int k = obj->capacity_k;if (!myCircularQueueIsEmpty(obj)){int front = obj->c_front % (k + 1);return obj->data[front];}return -1;
}int myCircularQueueRear(MyCircularQueue* obj)
{assert(obj);int k = obj->capacity_k;if (!myCircularQueueIsEmpty(obj)){int pre_rear = (obj->c_rear - 1) % (k + 1);return obj->data[pre_rear];}return -1;
}void myCircularQueueFree(MyCircularQueue* obj)
{assert(obj);free(obj->data);free(obj);
}

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

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

相關文章

網絡編程day3

1.思維導圖 2.TCP機械臂測試 tcpCli.c #include<myhead.h> #define SER_IP "192.168.125.162" //服務器IP #define SER_PORT 7777 //服務器端口#define CLI_IP "192.168.159.144" //客戶端IP #define CLI_PORT 9999 //客戶端端口號int…

婚姻情感 17

婚姻情感 17 怎么和女生聊天&#xff1f;讓對方感興趣給對方好體驗深層次的聊天刷心疼長得帥和強大的區別從我到我們 追女生的思路 怎么和女生聊天&#xff1f; 在和女生互動的時候就很難去進入一種很深層次的一個連接&#xff0c;就是說很多時候我們和女生互動總是停留在第三…

底層自行實現——監督學習算法(1線性回歸)

1.1 簡單線性回歸 1. 簡介 簡單線性回歸&#xff08;SLR - Simple Linear Regression&#xff09;模型可以表示為&#xff1a; Y β 0 β 1 X ? Y \beta_0 \beta_1X \epsilon Yβ0?β1?X? Y Y Y&#xff1a;因變量或目標變量。 X X X&#xff1a;自變量或解釋變量。…

考取ORACLE數據庫OCP的必要性 Oracle數據庫

OCP證書是什么&#xff1f; OCP&#xff0c;全稱Oracle Certified Professional&#xff0c;是Oracle公司的Oracle數據庫DBA&#xff08;Database Administrator&#xff0c;數據庫管理員)認證課程。這是Oracle公司針對數據庫管理領域設立的一項認證課程&#xff0c;旨在評估和…

C++ 學習筆記(Structured bindings)

C 學習筆記&#xff08;Structured bindings&#xff09; 這個特性是 C17 引入的&#xff0c;個人認為主要是解決如何讓函數返回多個值的問題。在這之前&#xff0c;我們一般用 std::pair 或者 std::tuple 來返回多個值。比如下面的例子&#xff1a; std::tuple<int, int …

網盤拉新項目去哪找平臺對接?推薦6個一手渠道接單!

在當今這個充滿競爭的時代&#xff0c;網盤項目的尋找與對接成為了許多團隊關注的焦點。那么&#xff0c;我們應該如何找到那些既靠譜又有潛力的項目呢&#xff1f;經過深入研究和全網檢索&#xff0c;我為大家盤點了6個值得一試的接單渠道&#xff0c;助力網盤推廣團隊高效尋找…

matlab工具包

matlab安裝yalmip和cplex出錯 - 知乎 (zhihu.com) Cplex的安裝和使用實例-CSDN博客 一條龍教程&#xff1a;Matlab下使用yalmip(工具箱)cplex&#xff08;求解器&#xff09;_使用yalmip和cplex求解器進行建模和求解的步驟如下:-CSDN博客 啊啊啊&#xff0c;好開心&#xff…

Mint_21.3 drawing-area和goocanvas的FB筆記(二)

一、goocanvas安裝 Linux mint 21.3 庫中帶有 libgoocanvas-2.0-dev, 用sudo apt install libgoocanvas-2.0-dev 安裝&#xff0c;安裝完成后&#xff0c;檢查一個 /usr/lib/x86_64-linux-gnu 下是否有libgoocanvas.so的軟件鏈接。如果沒有&#xff0c;或是 .so.x 等類似后面…

事務Transaction簡寫為tx的原因

版權聲明 本文原創作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Transaction簡寫的由來 數據庫事務Transaction通常被簡寫為tx。讓人疑惑的是&#xff1a;這個單詞本身沒有字母x為何又將其簡寫成了tx呢&#xff1f; 第一種可能 Transac…

SpringBoot整合ActiveMQ步驟

SpringBoot整合ActiveMQ主要涉及以下幾個步驟&#xff1a; 添加依賴&#xff1a;在SpringBoot項目的pom.xml文件中添加ActiveMQ的依賴。 <dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-spring</artifactId><ver…

“平民化”非結構數據處理

在全球信息產業高速發展的背景下&#xff0c;IDC預測&#xff0c;2018 到 2025 年之間&#xff0c;全球產生的數據量將會從 33 ZB 增長到 175 ZB&#xff0c; 復合增長率27%&#xff0c;其中超過 80%的數據都會是處理難度較大的非結構化數據&#xff0c;如文檔、文本、圖形、圖…

搜索題解

單詞方陣 - 洛谷 思路&#xff1a;在字符方陣中找到y并將其坐標存入數組&#xff0c;再找其八個方向是否有目標字符&#xff0c;有的話就深搜一個方向&#xff0c;能搜完就將數組標記&#xff0c;最好標記的就輸入字符&#xff0c;沒標記的就輸出*。 代碼如下&#xff1a; #…

linux 拷貝文件到指定目錄 命令

在 Linux 中&#xff0c;使用 cp 命令可以拷貝文件到指定目錄。下面是 cp 命令的基本用法&#xff1a; bash cp [選項] 源文件 目標目錄 - 選項&#xff1a;可以是一些附加的選項&#xff0c;例如 -r 表示遞歸拷貝&#xff08;用于復制目錄&#xff09;。 - 源文件&#xff1a…

javascript中的class基礎入門(1)

javascript中的class start 最近在學習&#xff1a;cocos &#xff0c;準備自己制作小游戲。過程中遇到不少疑問&#xff0c;我計劃將這些疑問寫成一個系列博客&#xff0c;用以記錄。這篇文章來了解 class 1. 前言 1. 前言 本文對應版本 Cocos Creator 3.8。Cocos Creato…

【Sql server】假設有三個字段a,b,c 以a和b分組,如何查詢a和b唯一,但是c不同的記錄

歡迎來到《小5講堂》&#xff0c;大家好&#xff0c;我是全棧小5。 這是《Sql Server》系列文章&#xff0c;每篇文章將以博主理解的角度展開講解&#xff0c; 特別是針對知識點的概念進行敘說&#xff0c;大部分文章將會對這些概念進行實際例子驗證&#xff0c;以此達到加深對…

2_SQL

文章目錄 SQL數據完整性實體完整性域完整性參照完整性default&#xff08;默認值&#xff09;comment&#xff08;注釋&#xff09; 多表設計一對一一對多多對多數據庫三大范式第一范式&#xff1a;原子性第二范式&#xff1a;唯一性第三范式&#xff1a;數據的冗余 多表查詢連…

JQMobile Loader Widget 遮罩層改造

最近在用jqmobile 做一個混合APP項目時候用到 jqmobile1.4.3提供的Loader Widget控件,但是這個控件本身是一個loading彈出層,這個彈出層彈出之后,用戶還是可以去點擊按鈕,重復發送請求,為了防止重復提交,我想了兩種辦法, 1,在loading彈出層彈出之后,讓按鈕不可用.但是form表單…

記錄SSM項目集成Spring Security 4.X版本 之 加密驗證和記住我功能

目錄 前言 一、用戶登錄密碼加密認證 二、記住我功能 前言 本次筆記的記錄是接SSM項目集成Spring Security 4.X版本 之 加入DWZ,J-UI框架實現登錄和主頁菜單顯示-CSDN博客https://blog.csdn.net/u011529483/article/details/136255768?spm1001.2014.3001.5502 文章之后補…

Python列表的合并、重復、判斷與切片操作你學會了嗎

1.合并列表 通過 實現 list1 ["佛跳墻", "腸粉", "刀削面", "烤鴨"]list2 [32, 4, 5, 7.43, True]list3 list1 list2print(list3) # [佛跳墻, 腸粉, 刀削面, 烤鴨, 32, 4, 5, 7.43, True] 2.重復輸出列表中的元素 通過 * 實…

fastadmin 前端日期字段的添加和編輯

引言 fastadmin 項目中如果需要用到datetime字段的維護&#xff0c;可做如下處理&#xff1a; 1. add.html <div class"form-group"><label class"control-label col-xs-12 col-sm-2">{:__(開始)}:</label><div class"col-x…