您的位置:首页 > 其它

第二题 设计包含min 函数的栈。

2014-08-31 17:31 267 查看
定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。
要求函数min、push 以及pop 的时间复杂度都是O(1)。

思想:用一个栈来存储最小的元素,主要是压栈函数的写法,1)压栈时先判断栈是否为满了或是空的,然后再判断当前压入的元素是否比前一个元素大,大的话交换位置;2)直接得到栈顶元素的引用,对栈顶元素进行赋值,主要最小值的取法。

#include<iostream>
using namespace std;
struct MinStackElement
{
int data;
int min;
};
struct MinStack
{
MinStackElement *data;
int size;
int top;
};
MinStack MinStackInit(int maxSize)
{
MinStack stack;
stack.size = maxSize;
stack.data = (MinStackElement*) malloc(sizeof(MinStackElement)*maxSize);
stack.top = -1;
return stack;
}
void MinStackFree(MinStack stack)
{
free(stack.data);
}

//压栈时先判断栈是否为满了或是空的,然后再判断当前压入的元素是否比前一个元素大,大的话交换位置
void MinStackPush(MinStack *stack, int d)
{
if (stack->top == stack->size-1) cout<<"out of stack space.";
MinStackElement *tmp=(MinStackElement*) malloc(sizeof(MinStackElement));
if(tmp==NULL)
return;
tmp->data=tmp->min=d;

if(stack->top==-1)
{
stack->top++;
stack->data[stack->top]=*tmp;
}
else
{
MinStackElement p = stack->data[stack->top];
if (p.min < d)
{
stack->top++;
stack->data[stack->top]=p;
stack->data[stack->top-1]=*tmp;
}
else
{
stack->top++;
stack->data[stack->top]=*tmp;
}
}
}
int MinStackPop(MinStack *stack)
{
int tmp;
if (stack->top == -1) cout<<"stack is empty!";
tmp=stack->data[stack->top].data;
stack->top--;
return tmp;
}
int MinStackMin(MinStack stack)
{
if (stack.top == -1) cout<<" stack is empty!\n";
return stack.data[stack.top].min;
}
int main()
{
int data;
MinStack test=MinStackInit(10);
for(int i=0;i<5;i++)
{
cin>>data;
MinStackPush(&test,data);
}
// 输出栈中元素
/*
for(int j=0;j<5;j++)
{
cout<<MinStackPop(&test)<<endl;
}
*/
// 输出最小的元素
cout<<MinStackMin(test)<<endl;
return 1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: