【每日刷题】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;

}

相关推荐
Gpluso_od2 小时前
算法常用库函数——C++篇
数据结构·c++·算法
bingw01142 小时前
25. 求满足条件的最长子串的长度
数据结构·算法
励志成为大佬的小杨3 小时前
关键字初级学习
c语言·开发语言·算法
机器懒得学习3 小时前
打造智能化恶意软件检测桌面系统:从数据分析到一键报告生成
人工智能·python·算法·数据挖掘
szpc16214 小时前
100V宽压输入反激隔离电源,适用于N道沟MOSFET或GaN或5V栅极驱动器,无需光耦合
c语言·开发语言·人工智能·单片机·嵌入式硬件·生成对抗网络·fpga开发
skaiuijing4 小时前
优化程序中的数据:从代数到向量解
线性代数·算法·性能优化·计算机科学
一般路过半缘君5 小时前
高阶数据结构之并查
数据结构
懿所思5 小时前
8.Java内置排序算法
java·算法·排序算法
sleP4o5 小时前
求各种排序算法的执行时间
算法·排序算法
码农老起5 小时前
选择排序:简单算法的实现与优化探索
数据结构·算法·排序算法