-
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。
-
输入:
-
输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行为一个整数n(1<=n<=1000000), n代表将要输入的操作的步骤数。
接下来有n行,每行开始有一个字母Ci。
Ci=’s’时,接下有一个数字k,代表将k压入栈。
Ci=’o’时,弹出栈顶元素。
对应每个测试案例中的每个操作,
若栈不为空,输出相应的栈中最小元素。否则,输出NULL。
思路:
基本思路, 另外建立一个辅助栈,辅助栈栈顶记录的当天栈中最小元素的值,他与数据栈执行一样的操作,当数据栈入栈是,辅助栈也入栈,入栈的元素为min(数据栈栈顶元素,辅助栈栈顶元素),元数据出栈时,辅助栈也出栈。
进一步优化
辅助栈主要是记录数据栈当前的最小值,可以进一步优化空间。考虑如下情况,如果数据栈入栈的元素为 a,他比元数据栈最小元素栈小,在入栈前后栈的最小元素没有发生变化。既然没有发生变化,辅助栈也不要更新最小值,也不记录。
辅助栈出栈,是数据栈出栈的元素值小于辅助栈的栈顶元素
代码
#include<iostream> #include<stack> using namespace std; /* 需要考虑的问题 1 如果栈中元素为空,执行pop操作时该怎么定义; 2. 入栈中有相同元素时该怎么办,加入技术min(min栈) 3, 元素集为空时,min返回NULL */ class MyStack { public : MyStack() { myStack=new stack<int>; min=new stack<int>; state=0; } void push(int a) { myStack->push(a); state=0; if(min->empty()) { min->push(a); } else if(a<=min->top()) { min->push(a); //printf("push into min\n"); //printf(" %d size min \n",min->size()); } } int pop() { int value; if(myStack->empty()) { state=-1; return -1; } else { value=myStack->top(); myStack->pop(); if(myStack->empty()) { state=-1;} if(value==min->top()) { min->pop(); //printf(" %d pop int min \n",min->size()); } } return value; } int minValue() { if(min->empty()) { //printf("NULL\n") } else { return min->top(); } } int getState() { int tem=state; state=0; return tem; } private : stack<int> *myStack; stack<int >*min; int state; }; int main() { MyStack mStack; int count; scanf("%d",&count); getchar(); if(count<=0) { printf("NULL"); } else { int i=0; char operation; int inNum; while(i<count) { scanf("%c",&operation); if('s'==operation) { i++; scanf("%d",&inNum); mStack.push(inNum); printf("%d\n",mStack.minValue()); } else if('o'==operation) { i++; mStack.pop(); if(-1==mStack.getState()) { printf("NULL\n"); } else { printf("%d\n",mStack.minValue()); } } else { //printf("error input %c",operation); } } } return 1; }