Min Stack 最小栈

看到这个最小堆的解题思路,这里自己练习着实现下细节。

主要思路就是两个栈,数据栈是保存原始数据的,另外一个辅助栈栈顶元素保存当前数据栈中最小元素

所以获取最小元素就直接读取辅助栈栈顶元素即可,同时数据栈的进栈、出栈的时候要维护辅助栈的栈顶的元素,以同步更新最小元素。

class MinStack {
public:
	/** initialize your data structure here. */
	MinStack() {
		curIdx = -1;//初始化arr栈顶索引
		curMin = -1;//初始aux栈顶索引
		maxCap = 10;
		arr = new int[maxCap];
		memset(arr, 0, maxCap);
		aux = new int[maxCap];
		memset(aux, 0, maxCap);
	}

	void push(int x) {
		if(curIdx + 1 >= maxCap){
			int* arrtmp = new int[maxCap*2];
			memset(arrtmp, 0, maxCap*2);
			memcpy(arrtmp, arr, maxCap*sizeof(int));
			delete arr;
			arr = arrtmp;

			int* auxtmp = new int[maxCap*2];
			memset(auxtmp, 0, maxCap*2);
			memcpy(auxtmp, aux, maxCap*sizeof(int));
			delete aux;
			aux = auxtmp;

			maxCap *= 2;
		}
		arr[++curIdx] = x;
		if(curMin == -1)
			aux[++curMin] = x;
		else if(x <= aux[curMin])
			aux[++curMin] = x;
	}
	void pop() {

			if(curIdx > -1)//非空的时候才pop
			{
				if(arr[curIdx] == aux[curMin]){
					aux[curMin] = 0;
					if(curMin  > -1)//非空的时候才pop
						curMin--;				
				}
				arr[curIdx] = 0;
				curIdx--;
			}

	}

	int top() {
		if(curIdx > -1)//非空的时候才top
		return arr[curIdx];
		else
			return -1;
	}

	int getMin() {
		return aux[curMin];
	}
private:
	/* data structure */
	int* arr;	//当前栈
	int maxCap; //arr栈的最大容量
	int curIdx; //arr当前栈顶索引
	int* aux;	//辅助栈
	int curMin; //aux栈顶索引(arr里面的最小数值)
};


在leetcode上有这道题,觉得自己的代码过于冗长,是不是哪里还有优化的地方?

查看solution发现c++解题最高票答案直接使用的是两个stack容器,代码很简洁。不过自己对题目描述的理解,觉得这里的stack还是需要自己来实现的。

当然,数组可以用vector来替代以简化掉自动扩容的逻辑。

你可能感兴趣的:(数据结构与算法,leetcode,数据结构与算法,stack)