2.3 数据结构之 栈 (C语言版)

编程总结

在刷题之前需要反复练习的编程技巧,尤其是手写各类数据结构实现,它们好比就是全真教的上乘武功

栈是限制插入和删除只能在一个位置上进行的线性表。其中,允许插入和删除的一端位于表的末端,叫做栈顶(top),不允许插入和删除的另一端叫做栈底(bottom)。对栈的基本操作有 PUSH(压栈)和 POP (出栈),前者相当于表的插入操作(向栈顶插入一个元素),后者则是删除操作(删除一个栈顶元素)。栈是一种后进先出(LIFO)的数据结构,最先被删除的是最近压栈的元素。栈就像是一个箱子,往里面放入一个小盒子就相当于压栈操作,往里面取出一个小盒子就是出栈操作,取盒子的时候,最后放进去的盒子会最先被取出来,最先放进去的盒子会最后被取出来,这即是后入先出。下面是一个栈的示意图:

115. 最小栈

2.3 数据结构之 栈 (C语言版)_第1张图片
/-------------------------------------------分割线--------------------------------------/
栈只有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. 有效的括号

2.3 数据结构之 栈 (C语言版)_第2张图片

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. 每日温度

2.3 数据结构之 栈 (C语言版)_第3张图片

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;
}

你可能感兴趣的:(编程之美)