1.1流程圖??給定一個只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判斷字符串是否有效。
有效字符串需滿足:(1)左括號必須用相同類型的右括號閉合。(2)左括號必須以正確的順序閉合。(3)每個右括號都有一個對應(yīng)的相同類型的左括號。
來源:力扣(LeetCode)
鏈接:https://leetcode.cn/problems/valid-parentheses/
//使用動態(tài)數(shù)組實(shí)現(xiàn)棧
typedef struct SeqStack
{char* arr;
int top;
int capacity;
}SeqStack;
//判空
bool IsEmpty(SeqStack* ps)
{if(ps->top == -1)
return true;
return false;
}
//初始化
void InitStack(SeqStack* ps)
{ps->arr = (char*)malloc(4*sizeof(char));
if(ps->arr == NULL)
return;
ps->top = -1;
ps->capacity = 4;
}
//進(jìn)棧
void Push(SeqStack* ps,char ch)
{if(ps->top + 1 == ps->capacity)
{char* tmp = (char*)realloc(ps->arr,ps->capacity*2*sizeof(char));
if(tmp == NULL)
return;
ps->arr = tmp;
ps->capacity *= 2;
}
ps->arr[++ps->top] = ch;
}
//出棧
void Pop(SeqStack* ps)
{if(ps->top == -1)
return;
ps->top--;
}
//取棧頂元素
char GetTopElement(SeqStack* ps)
{char ch = ps->arr[ps->top];
return ch;
}
//棧的括號匹配
bool isValid(char * s){int len = strlen(s);
SeqStack stack;
InitStack(&stack);
//遍歷原數(shù)組
for(int i = 0;i< len;i++)
{//左括號進(jìn)棧
if(s[i] == '(' || s[i] == '[' || s[i] == '{')
{Push(&stack,s[i]);
}
//右括號與棧頂元素比較
else
{ //右括號單身
if(IsEmpty(&stack))
return false;
//取棧頂元素
char ret = GetTopElement(&stack);
//三種情況左右括號不匹配
if(s[i] == ')' && ret != '(')
return false;
else if(s[i] == ']' && ret != '[')
return false;
else if(s[i] == '}' && ret != '{')
return false;
Pop(&stack);
}
}
//左括號不單身
if(IsEmpty(&stack))
return true;
//左括號單身
else
return false;
}
1.3復(fù)雜度時間復(fù)雜度:O(n)
空間復(fù)雜度:O(1)
2.1思路??請你僅使用兩個隊(duì)列實(shí)現(xiàn)一個后入先出(LIFO)的棧,并支持普通棧的全部四種操作(push、top、pop 和 empty)。
來源:力扣(LeetCode)
鏈接:https://leetcode.cn/problems/implement-stack-using-queues/
2.2畫圖1.用兩個隊(duì)列實(shí)現(xiàn)棧的各個功能
2.創(chuàng)建棧
先創(chuàng)建棧malloc 再初始化兩個隊(duì)列
3.插入(push)
將數(shù)據(jù)插入到非空隊(duì)列
4.刪除(pop)
將非空隊(duì)列(元素個數(shù)>1)倒到另外一個空隊(duì)列當(dāng)中,然后非空隊(duì)列只剩一個元素,此時彈出該元素,就實(shí)現(xiàn)棧的刪除
5.取棧頂元素
取非空隊(duì)列的隊(duì)尾元素
6.判空
當(dāng)兩個隊(duì)列全為空時,棧為空
7.銷毀棧(destroy)
先銷毀兩個隊(duì)列,再釋放棧
//方便修改數(shù)據(jù)類型
typedef int ElemType;
//定義隊(duì)列結(jié)點(diǎn)
typedef struct QueueNode
{ElemType data;//數(shù)據(jù)域
struct QueueNode* next;//指針域
}QueueNode;
//封裝隊(duì)頭指針和隊(duì)尾指針
typedef struct Queue
{QueueNode* head;
QueueNode* tail;
int size;
}Queue;
//初始化
void InitQueue(Queue* q)
{assert(q);
q->head = q->tail = NULL;
q->size = 0;
}
//判空
bool IsEmpty(Queue* q)
{assert(q);
if (q->size == 0)
return true;
return false;
}
//入隊(duì)
void Push(Queue* q,ElemType x)
{assert(q);
if (q->size == 0)
{QueueNode* tmp = (QueueNode*)malloc(sizeof(QueueNode));
if (tmp == NULL)
return;
q->head = q->tail = tmp;
tmp->data = x;
tmp->next = NULL;
q->size++;
}
else
{QueueNode* tmp = (QueueNode*)malloc(sizeof(QueueNode));
if (tmp == NULL)
return;
tmp->data = x;
tmp->next = NULL;
q->tail->next = tmp;
q->tail = q->tail->next;
q->size++;
}
}
//出隊(duì)
void Pop(Queue* q)
{assert(q && q->head);
if (q->size == 0)
return;
if (q->head == q->tail)
{free(q->head);
q->head = q->tail = NULL;
q->size--;
}
else
{QueueNode* del = q->head;
q->head = del->next;
q->size--;
free(del);
}
}
//取隊(duì)首元素
ElemType GetHeadElement(Queue* q)
{assert(q);
assert(!IsEmpty(q));
return q->head->data;
}
//取隊(duì)尾元素
ElemType GetTailElement(Queue* q)
{assert(q && q->head);
return q->tail->data;
}
//求隊(duì)長
int QueueSize(Queue* q)
{assert(q);
return q->size;
}
//銷毀隊(duì)列
void DestroyQueue(Queue* q)
{assert(q);
QueueNode* cur = q->head;
while (cur)
{QueueNode* tmp = cur->next;
free(cur);
cur = tmp;
}
q->head = q->tail = NULL;
q->size = 0;
}
//封裝兩個隊(duì)列定義棧結(jié)構(gòu)
typedef struct {Queue q1;
Queue q2;
} MyStack;
//先malloc在初始化兩個隊(duì)列
MyStack* myStackCreate() {//定義棧
MyStack* obj = (MyStack*)malloc(sizeof(MyStack));
//初始化隊(duì)列q1和隊(duì)列q2
InitQueue(&obj->q1);
InitQueue(&obj->q2);
//返回棧
return obj;
}
//進(jìn)棧
void myStackPush(MyStack* obj, int x) {//在非空隊(duì)列中插入數(shù)據(jù)
if(!IsEmpty(&obj->q1))
Push(&obj->q1,x);
else
Push(&obj->q2,x);
}
//出棧
int myStackPop(MyStack* obj) {//假設(shè)法找空隊(duì)列
Queue* empty = &obj->q1;
Queue* nonempty = &obj->q2;
if(!IsEmpty(&obj->q1))
{empty = &obj->q2;
nonempty = &obj->q1;
}
//當(dāng)非空隊(duì)列的元素個數(shù)>1,將其前面的元素插入到空隊(duì)列當(dāng)中實(shí)現(xiàn)倒數(shù)據(jù)
while(QueueSize(nonempty) >1)
{//往空隊(duì)列中倒入一個元素,非空隊(duì)列就刪除該元素
Push(empty,GetHeadElement(nonempty));
Pop(nonempty);
}
//將非空隊(duì)列的最后一個元素保存下來
int top = GetHeadElement(nonempty);
//刪除非空隊(duì)列的最后一個元素
Pop(nonempty);
//返回棧頂元素(非空隊(duì)列的最后一個元素)
return top;
}
//取棧頂元素
int myStackTop(MyStack* obj) {//將非空隊(duì)列的隊(duì)尾元素返回
if(!IsEmpty(&obj->q1))
return GetTailElement(&obj->q1);
else
return GetTailElement(&obj->q2);
}
//判空
bool myStackEmpty(MyStack* obj) {//當(dāng)兩個隊(duì)列同時為空,棧就為空
return IsEmpty(&obj->q1) && IsEmpty(&obj->q2);
}
//銷毀棧
void myStackFree(MyStack* obj) {//銷毀隊(duì)列q1和隊(duì)列q2
DestroyQueue(&obj->q1);
DestroyQueue(&obj->q2);
//釋放棧
free(obj);
}
3.用棧實(shí)現(xiàn)隊(duì)列3.1思想??請你僅使用兩個棧實(shí)現(xiàn)先入先出隊(duì)列。隊(duì)列應(yīng)當(dāng)支持一般隊(duì)列支持的所有操作(push、pop、peek、empty)
來源:力扣(LeetCode)
鏈接:https://leetcode.cn/problems/implement-queue-using-stacks/
3.2畫圖1.用兩個棧實(shí)現(xiàn)隊(duì)列的各個功能
一個棧(pushStack)專門用來存數(shù)據(jù),另外一個棧(popStack)用來刪數(shù)據(jù)
2.創(chuàng)建隊(duì)列
先創(chuàng)建隊(duì)列malloc 再初始化兩個棧
3.插入(push)
直接將元素插入到pushStack,也就是代碼里的q1
4.取隊(duì)首元素
將pushStack里的元素倒入到popStack中,然后再返回popStack的棧頂元素,并彈出該元素
5.刪除(pop)
彈出popStack的棧頂元素
6.判空
當(dāng)兩個棧全為空,隊(duì)列為空
7.銷毀隊(duì)列(destroy)
先銷毀兩個棧,再釋放隊(duì)列
//方便修改數(shù)據(jù)類型
typedef int ElemType;
//定義棧結(jié)構(gòu)
typedef struct SeqStack
{ElemType* a;
int top;//棧頂指針
int capacity;//棧容量
}SeqStack;
//判空
bool IsEmpty(SeqStack* ps)
{//為什么assert,非常規(guī)思維
assert(ps);
if (ps->top == -1)
return true;
return false;
}
//初始化
void InitStack(SeqStack* ps)
{assert(ps);
ps->a = (ElemType*)malloc(4 * sizeof(ElemType));
if (ps->a == NULL)
{ return;
}
ps->top = -1;
ps->capacity = 4;
}
//取棧頂元素
ElemType GetTopElement(SeqStack* ps)
{assert(ps);
ElemType x = ps->a[ps->top];
return x;
}
//求棧長
int StackLength(SeqStack* ps)
{assert(ps);
return ps->top + 1;
}
//進(jìn)棧
void StackPush(SeqStack* ps, ElemType x)
{assert(ps);
if (StackLength(ps) == ps->capacity)
{ElemType* tmp = (ElemType*)realloc(ps->a, ps->capacity * 2 * sizeof(ElemType));
if (tmp == NULL)
{ return;
}
ps->a = tmp;
ps->capacity *= 2;
}
ps->a[++ps->top] = x;
}
//出棧
void StackPop(SeqStack* ps)
{assert(ps);
if (IsEmpty(ps))
return;
ps->top--;
}
//銷毀棧
void DestroyStack(SeqStack* ps)
{assert(ps);
free(ps->a);
ps->a = NULL;
ps->capacity = 0;
ps->top = -1;
}
//定義兩個棧創(chuàng)建隊(duì)列
typedef struct {SeqStack q1;
SeqStack q2;
} MyQueue;
//創(chuàng)建隊(duì)列再初始化兩個棧
MyQueue* myQueueCreate() {//創(chuàng)建隊(duì)列
MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));
//初始化兩個棧
InitStack(&obj->q1);
InitStack(&obj->q2);
//返回隊(duì)列
return obj;
}
//入隊(duì)
void myQueuePush(MyQueue* obj, int x) {assert(obj);
StackPush(&obj->q1,x);
}
//出隊(duì)
int myQueuePop(MyQueue* obj) {assert(obj);
int peek = myQueuePeek(obj);
StackPop(&obj->q2);
return peek;
}
//取隊(duì)首元素
int myQueuePeek(MyQueue* obj) {assert(obj);
//如果popStack為空且pushStack不為空
//就將pushStack的元素倒入到popStack當(dāng)中
if(IsEmpty(&obj->q2))
{while(!IsEmpty(&obj->q1))
{ //將pushStack當(dāng)中的元素倒入到popStack當(dāng)中
StackPush(&obj->q2,GetTopElement(&obj->q1));
//彈出pushStack的棧頂元素
StackPop(&obj->q1);
}
}
//返回隊(duì)首元素(也就是popStack當(dāng)中的棧頂元素)
return GetTopElement(&obj->q2);
}
//判空
bool myQueueEmpty(MyQueue* obj) {assert(obj);
//當(dāng)兩個棧同時為空時,隊(duì)列為空
return IsEmpty(&obj->q1) && IsEmpty(&obj->q2);
}
//銷毀隊(duì)列
void myQueueFree(MyQueue* obj) {assert(obj);
//先銷毀兩個棧
DestroyStack(&obj->q1);
DestroyStack(&obj->q2);
//釋放隊(duì)列
free(obj);
}
4.循環(huán)隊(duì)列4.1思想??設(shè)計(jì)你的循環(huán)隊(duì)列實(shí)現(xiàn)。 循環(huán)隊(duì)列是一種線性數(shù)據(jù)結(jié)構(gòu),其操作表現(xiàn)基于 FIFO(先進(jìn)先出)原則并且隊(duì)尾被連接在隊(duì)首之后以形成一個循環(huán)。它也被稱為“環(huán)形緩沖器”。
循環(huán)隊(duì)列的一個好處是我們可以利用這個隊(duì)列之前用過的空間。在一個普通隊(duì)列里,一旦一個隊(duì)列滿了,我們就不能插入下一個元素,即使在隊(duì)列前面仍有空間。但是使用循環(huán)隊(duì)列,我們能使用這些空間去存儲新的值。
來源:力扣(LeetCode)
鏈接:https://leetcode.cn/problems/design-circular-queue
4.2畫圖??使用鏈表或者數(shù)組實(shí)現(xiàn)循環(huán)隊(duì)列,因?yàn)榍罢卟荒茈S機(jī)訪問,所以我們選擇用數(shù)組實(shí)現(xiàn)循環(huán)隊(duì)列。循環(huán)隊(duì)列頭尾相連,大小固定。
兩大問題:
1.如何判空判滿
(1)增加加一個計(jì)數(shù)變量(size)
(2)創(chuàng)建一個空結(jié)點(diǎn)
2.如何用數(shù)組實(shí)現(xiàn)循環(huán)
(1)特殊處理
if(rear == Maxsize) rear = 0;
(2)循環(huán)取模
(rear + 1) % Maxsize
//定義循環(huán)隊(duì)列結(jié)構(gòu)
typedef struct {int* arr;//數(shù)組
int front;//隊(duì)頭指針
int rear;//隊(duì)尾指針
int k;//循環(huán)隊(duì)列有效元素個數(shù)
} MyCircularQueue;
//創(chuàng)建循環(huán)隊(duì)列(隊(duì)列總大小為k+1)
MyCircularQueue* myCircularQueueCreate(int k) {//創(chuàng)建循環(huán)隊(duì)列
MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
//開辟k+1個數(shù)組元素
obj->arr = (int*)malloc((k+1)*sizeof(int));
//置空
obj->front = obj->rear = 0;
//循環(huán)隊(duì)列有效元素個數(shù)
obj->k = k;
//返回循環(huán)隊(duì)列
return obj;
}
//判空
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {assert(obj);
if(obj->front == obj->rear)
return true;
return false;
}
//判滿
bool myCircularQueueIsFull(MyCircularQueue* obj) {assert(obj);
if((obj->rear + 1)%(obj->k + 1) == obj->front)
return true;
return false;
}
//入隊(duì)
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {assert(obj);
//判滿
if(myCircularQueueIsFull(obj))
return false;
//存值
obj->arr[obj->rear] = value;
//循環(huán)
obj->rear = (obj->rear + 1) % (obj->k + 1);
return true;
}
//出隊(duì)
bool myCircularQueueDeQueue(MyCircularQueue* obj) {assert(obj);
//判空
if(myCircularQueueIsEmpty(obj))
return false;
//循環(huán)
obj->front = (obj->front + 1) % (obj->k + 1);
return true;
}
//取隊(duì)首元素
int myCircularQueueFront(MyCircularQueue* obj) {assert(obj);
//判空
if(myCircularQueueIsEmpty(obj))
return -1;
//取值
return obj->arr[obj->front];
}
//取隊(duì)尾元素
int myCircularQueueRear(MyCircularQueue* obj) {assert(obj);
//判空
if(myCircularQueueIsEmpty(obj))
return -1;
//找到rear的前一個結(jié)點(diǎn)
int rear = (obj->rear + obj->k) % (obj->k + 1);
return obj->arr[rear];
}
//銷毀循環(huán)隊(duì)列
void myCircularQueueFree(MyCircularQueue* obj) {assert(obj);
//先釋放開辟的k+1個數(shù)組大小的空間
free(obj->arr);
//再釋放開辟的結(jié)構(gòu)體變量
free(obj);
}
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)站標(biāo)題:棧和隊(duì)列的應(yīng)用-創(chuàng)新互聯(lián)
轉(zhuǎn)載注明:http://chinadenli.net/article4/dcpsie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、建站公司、Google、定制開發(fā)、App開發(fā)、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容