【每日刷题】Day33

【每日刷题】Day33

🥕个人主页:开敲🍉

🔥所属专栏:每日刷题🍍

🌼文章目录🌼

[1. 20. 有效的括号 - 力扣(LeetCode)](#1. 20. 有效的括号 - 力扣(LeetCode))

[2. 445. 两数相加 II - 力扣(LeetCode)](#2. 445. 两数相加 II - 力扣(LeetCode))

[3. 1021. 删除最外层的括号 - 力扣(LeetCode)](#3. 1021. 删除最外层的括号 - 力扣(LeetCode))

1. 20. 有效的括号 - 力扣(LeetCode)

//思路:栈的基本使用。

typedef char STDataType;

typedef struct Stack

{

STDataType* arr;

int top;

int capacity;

}ST;

//初始化栈

void StackInit(ST* st)

{

st->arr = NULL;

st->top = 0;

st->capacity = 0;

}

//入栈

void StackPush(ST* st,STDataType s)

{

assert(st);

if(st->top==st->capacity)

{

int newcapacity = st->capacity == 0?4:2*st->capacity;

STDataType* tmp = (STDataType*)realloc(st->arr,newcapacity*sizeof(STDataType));

if(tmp==NULL)

{

perror("malloc:");

exit(-1);

}

st->capacity = newcapacity;

st->arr = tmp;

}

st->arr[st->top] = s;

st->top++;

}

//获取栈顶元素

STDataType StackTop(ST* st)

{

assert(st);

assert(st->top>0);

return st->arr[st->top-1];

}

//出栈

void StackPop(ST* st)

{

assert(st);

assert(st->top>0);

st->top--;

}

//判断栈是否为空

bool StackEmpty(ST* st)

{

assert(st);

return st->top == 0;

}

bool isValid(char* s)

{

ST st;

StackInit(&st);//初始化栈

while(*s)

{

if(*s=='{'||*s=='['||*s=='(')//如果遇到左括号,则入栈

{

StackPush(&st,*s);

}

else//如果遇到右括号,将栈中元素出栈

{

if(StackEmpty(&st))//如果前面没有入过栈,则直接返回

{

return false;

}

STDataType tmp = StackTop(&st);//先取得栈顶元素,判断是否与右括号匹配

StackPop(&st);//出栈

if((tmp=='('&&*s!=')')//如果不匹配,直接返回

||(tmp=='{'&&*s!='}')

||(tmp=='['&&*s!=']'))

{

return false;

}

}

s++;

}

bool ret = StackEmpty(&st);//判断栈是否为空,为空说明所有左括号均与右括号匹配,为true,否则为false

return ret;

}

2. 445. 两数相加 II - 力扣(LeetCode)

//思路:栈和链表的基本使用。

typedef struct ListNode LN;

int max(int x,int y)

{

return x>y?x:y;

}

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)

{

LN* newhead = NULL;

int i = 0;

int j = 0;

int arr1[100] = {0};

int arr2[100] = {0};

LN* pmove1 = l1;

LN* pmove2 = l2;

int flag = 0;

while(pmove1)//链表1入栈

{

arr1[i++] = pmove1->val;

pmove1 = pmove1->next;

}

while(pmove2)//链表2入栈

{

arr2[j++] = pmove2->val;

pmove2 = pmove2->next;

}

i--;//定位栈顶元素

j--;

while(i>=0||j>=0)//两个栈同时出栈,元素相加,判断是否需要进位

{

LN* newnode = (LN*)malloc(sizeof(LN));//新节点,以头插的方式插入新链表

newnode->next = newhead;

newhead = newnode;

int x = i>=0?arr1[i]:0;//栈1元素

int y = j>=0?arr2[j]:0;//栈2元素

int tmp = (x+y+flag)%10;

newnode->val = tmp;

if(x+y+flag>=10)//判断是否进位

{

flag = 1;

}

else

{

flag = 0;

}

if(i>=0)//防止栈越界访问

{

i--;

}

if(j>=0)

{

j--;

}

}

if(flag)//如果出了循环,flag还为1,则说明最高位进了1,创建新节点,节点val为1,头插进链表中

{

LN* newnode = (LN*)malloc(sizeof(LN));

newnode->next = newhead;

newnode->val = 1;

newhead = newnode;

}

return newhead;

}

3. 1021. 删除最外层的括号 - 力扣(LeetCode)

//0ms 100%思路:与第一题类似,栈的基础使用。

typedef int STDataType;

//栈结构体

typedef struct Stack

{

STDataType* arr;

int top;

int capacity;

}ST;

//初始化栈

void StackInit(ST* st)

{

assert(st);

st->arr = NULL;

st->capacity = st->top = 0;

}

//释放栈

void StackRelease(ST* st)

{

assert(st);

free(st->arr);

st->arr = NULL;

st->capacity = st->top = 0;

}

//判空

bool StackEmpty(ST* st)

{

assert(st);

return st->top == 0;

}

//入栈

void StackPush(ST* st, STDataType x)

{

assert(st);

if (st->top == st->capacity)

{

int newcapacity = st->capacity == 0 ? 4 : 2 * st->capacity;

STDataType* tmp = (STDataType*)realloc(st->arr,sizeof(STDataType) * newcapacity);

if (tmp == NULL)

{

perror("malloc:");

exit(-1);

}

st->arr = tmp;

st->capacity = newcapacity;

}

st->arr[st->top] = x;

st->top++;

}

//出栈

void StackPop(ST* st)

{

assert(st);

assert(st->top > 0);

st->top--;

}

//获取栈顶元素

STDataType StackTop(ST* st)

{

assert(st);

assert(st->top > 0);

return st->arr[st->top - 1];

}

char* removeOuterParentheses(char* s)

{

ST st;

StackInit(&st);//初始化栈

char* arr = (char*)malloc(sizeof(char)*100000);//新空间存储删除后的字符串

int count = 0;

while(*s)

{

if(*s=='(')//如果为左括号入栈

{

StackPush(&st,*s);

}

if(st.top>1)//如果栈中元素大于1,说明当前*s不是要删除的括号,直接放入创建好的空间中

{

arr[count++] = *s;

}

if(*s==')')//如果是右括号,与栈中左括号匹配,出栈

{

StackPop(&st);

}

s++;

}

arr[count] = '\0';

return arr;

}

相关推荐
X同学的开始20 分钟前
数据结构之二叉树遍历
数据结构
limingade1 小时前
手机实时提取SIM卡打电话的信令和声音-新的篇章(一、可行的方案探讨)
物联网·算法·智能手机·数据分析·信息与通信
2401_858286112 小时前
52.【C语言】 字符函数和字符串函数(strcat函数)
c语言·开发语言
AIAdvocate3 小时前
Pandas_数据结构详解
数据结构·python·pandas
jiao000014 小时前
数据结构——队列
c语言·数据结构·算法
kaneki_lh4 小时前
数据结构 - 栈
数据结构
铁匠匠匠4 小时前
从零开始学数据结构系列之第六章《排序简介》
c语言·数据结构·经验分享·笔记·学习·开源·课程设计
C-SDN花园GGbond4 小时前
【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)
c语言·开发语言·数据结构·排序算法
迷迭所归处5 小时前
C++ —— 关于vector
开发语言·c++·算法
leon6255 小时前
优化算法(一)—遗传算法(Genetic Algorithm)附MATLAB程序
开发语言·算法·matlab