编程总结
在刷题之前需要反复练习的编程技巧,尤其是手写各类数据结构实现,它们好比就是全真教的上乘武功
栈是限制插入和删除只能在一个位置上进行的线性表。其中,允许插入和删除的一端位于表的末端,叫做栈顶(top),不允许插入和删除的另一端叫做栈底(bottom)。对栈的基本操作有 PUSH(压栈)和 POP (出栈),前者相当于表的插入操作(向栈顶插入一个元素),后者则是删除操作(删除一个栈顶元素)。栈是一种后进先出(LIFO)的数据结构,最先被删除的是最近压栈的元素。栈就像是一个箱子,往里面放入一个小盒子就相当于压栈操作,往里面取出一个小盒子就是出栈操作,取盒子的时候,最后放进去的盒子会最先被取出来,最先放进去的盒子会最后被取出来,这即是后入先出。下面是一个栈的示意图:
115. 最小栈
/-------------------------------------------分割线--------------------------------------/
栈只有top 统一叫:top
没有 head 和 tail.
#define MAX_SIZE 10000
typedef struct Stack {
int data[MAX_SIZE];
int top;
int min; // 保留一个最小值
} MinStack;
MinStack *minStackCreate() {
MinStack *obj = (MinStack *)malloc(sizeof(MinStack));
if (obj) {
obj->top = -1;
obj->min = INT_MAX;
return obj;
}
return NULL;
}
void minStackPush(MinStack *obj, int x) {
if (obj->top == MAX_SIZE - 1) {
return;
}
obj->data[++obj->top] = x; // 进栈 top++ 就行
obj->min = fmin(obj->min, x); // 为了计算最小值用
}
void minStackPop(MinStack *obj) {
int i = 0;
if (obj->top < 0) {
obj->min = INT_MAX;
return;
}
obj->top--; // 出栈 top-- 就行
obj->min = INT_MAX;
// top后这里需要重新找 min 点
for (i = 0; i <= obj->top; i++) {
obj->min = fmin(obj->min, obj->data[i]);
}
}
int minStackTop(MinStack *obj) {
return obj->data[obj->top];
}
int minStackGetMin(MinStack *obj) {
return obj->min;
}
void minStackFree(MinStack *obj) {
free(obj);
}
20. 有效的括号
bool isTrue(char a, char b)
{
if ((a == '(' && b == ')') || (a == '[' && b == ']') || (a == '{' && b == '}')) {
return true;
}
return false;
}
bool isValid(const char *s)
{
char str[10001] = {
0 }; // 定义一个数组当栈
int top = -1;
int i = 0;
int len = strlen(s);
if (len == 0) {
return false;
}
// 出现奇数个时,一定为false.
if (len % 2 == 1) {
return false;
}
str[++top] = s[i];
i++;
while (i < len) {
// 如果栈顶元素和字符匹配上了,则栈顶元素出栈
if (top >= 0 && (isTrue(str[top], s[i]) == true)) {
// 注意判断top < 0 时的传值, 此时str[top]无效
top--;
}
else {
str[++top] = s[i]; // 将字符入栈
}
i++;
}
if (top == -1) {
return true;
}
else {
return false;
}
}
739. 每日温度
int* dailyTemperatures(int* T, int TSize, int* returnSize)
{
*returnSize = TSize;
int top = -1; //栈顶下标
int stack[TSize];//创建TSize大小的数据 模拟栈 存储值为T的下标
int *result = (int *)malloc(sizeof(int)*TSize);
int cur = 0;
int index = 0;
int data = 0;
memset(result, 0, TSize*sizeof(int));
memset(stack, 0, TSize*sizeof(int));
for (int i = 0; i < TSize; i++) {
cur = T[i];
while (top >= 0) {
index = stack[top];
data = T[index];
if (cur > data) {
top--;
result[index] = i - index;
} else {
break;
}
}
top++;
stack[top] = i;
}
while (top >= 0) {
index = stack[top];
result[index] = 0;
top--;
}
return result;
}
转载:https://blog.csdn.net/wangwangmoon_light/article/details/116431882
查看评论