【C语言刷LeetCode】155. 最小栈(E)

设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。

push(x) -- 将元素 x 推入栈中。
pop() -- 删除栈顶的元素。
top() -- 获取栈顶元素。
getMin() -- 检索栈中的最小元素。
示例:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/min-stack
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

从题意可知,就是要用链表模拟栈。其实用链表模拟栈,队列,用双向链表比较好,逻辑会简化很多。

此题还涉及最小值,所以保留结构体中增加一个min字段就行了。

typedef struct listNode{
	int val;
    int minv;
	struct listNode *next;
	struct listNode *pre;
} MinStack;

struct listNode *end = NULL;

MinStack* minStackCreate() {
    MinStack* head;
	head = (MinStack*)malloc(sizeof(MinStack));
	head->next = NULL;
	head->pre = NULL;
	head->val = 0xfffffff;
    head->minv = 0xfffffff;
	end = head;
	return head;
}

/** Push element x onto stack. */
void minStackPush(MinStack* obj, int x) {
	MinStack* new = (MinStack*)malloc(sizeof(MinStack));
	new->val = x;
	new->next = NULL;
	
	end->next = new;
	new->pre = end;
    
    if((end == obj)||(end->minv > new->val)){
        new->minv = new->val;
    } else {
        new->minv = end->minv;
    }
	
	end = new;
}

/** Removes the element on top of the stack and returns that element. */
void minStackPop(MinStack* obj) {
  MinStack* temp;
  
  end = end->pre;
  temp = end->next;
  free(temp);

  end->next = NULL;
}

/** Get the top element. */
int minStackTop(MinStack* obj) {
  return end->val;
}

int minStackGetMin(MinStack* obj) {
  return end->minv;
}

void minStackFree(MinStack* obj) {
    while(end != obj) {
		minStackPop(end);
	}
	
	free(obj);
}
发布了124 篇原创文章 · 获赞 17 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/jin615567975/article/details/104364678