您的位置:首页 > 运维架构

设计包含min 函数的栈(push\pop\min)

2012-08-20 22:47 302 查看


一、题目:(感谢 http://blog.csdn.net/v_JULY_v 提供的题目)
设计包含min 函数的栈。

定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。

要求函数min、push 以及pop 的时间复杂度都是O(1)。

二、题目分析:
栈,仅在表尾进行插入和删除操作的线性表,具有后进先出的特性。

要完成这道题目,push、pop函数眨下眼睛就能写出来,问题时如何编写min函数使其能输出栈中最小元素且其时间复杂度为O(1)?

看了网上一些答案,发现这问题能用辅助栈记录最小元素的方式来解决,即每插入一个元素入栈同时把其最小元素push入辅助栈。

(保证辅助栈的栈顶为最小的元素,在入栈是只需要比较辅助栈的栈顶即可判断该元素是否是栈中的最小元素)

在pop栈顶元素时,只需把辅助栈的栈顶一起删除即可。

**辅助栈中的任意元素,必须为元素栈中由栈底至其相同位置的元素中的最小元素

三、代码:
//添加一个辅助栈,用于记录当前栈中最小的元素

#include<iostream>
using namespace std;

const int StackSize=10; //栈默认大小

class stack
{
public :
void ini();//初始化
void push(int x);//入栈
void pop();//出栈
void printStack();//输出栈中所有元素
void printMinStack();//输出栈中最小元素
void printAidStack();//输出辅助栈中所有元素
private :
int stackArray[StackSize];//保存栈元素
int minStack[StackSize];//保存栈中最小元素
int size;//栈大小
};

void stack::ini()
{
size = -1;
}

void stack::push(int x)
{
if(size == StackSize - 1) throw "上溢出";
else
{
size++;

if(size == 0) minStack[size] = x;
else
{
if(x < minStack[size-1]) minStack[size] = x;
else minStack[size] = minStack[size-1];
}
stackArray[size] = x;
}
}

void stack::pop()
{
cout<<"删除栈顶元素."<<endl;
if(size == -1) throw "下溢出";
else{size--;}
}

void stack::printStack()
{
cout<<"栈\t:";
for(int i=0;i<=size;i++)
{
cout<<stackArray[i]<<"  ";
}
cout<<endl;
}

void stack::printAidStack()
{
cout<<"辅助栈\t:";
for(int i=0;i<=size;i++)
{
cout<<minStack[i]<<"  ";
}
cout<<endl;
}

void stack::printMinStack()
{
cout<<"THE MIN IS : "<<minStack[size]<<endl;
}

void main()
{

stack st;
st.ini();
st.push(65);
st.push(423);
st.push(568);
st.push(14);
st.push(40);
st.push(62);
st.printStack();
st.printAidStack();
st.pop();
st.printStack();
st.printAidStack();

st.printMinStack();

}


截图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息