设计包含min 函数的栈。
定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。
要求函数min、push 以及pop 的时间复杂度都是O(1)。
如果不要求时间复杂度为O(1),那么只是一个很简单的进栈,出栈,比大小的操作。实现如下:
#include <iostream>
using namespace std;
#include <stdlib.h>
#define MAXSIZE 20
typedef struct Stack
{
int arr[MAXSIZE];
int top;
}*pStack;
//入栈操作
void push(pStack &p, int value)
{
if( p->top > MAXSIZE-1 )
{
cout << "栈已满,溢出" << endl;
exit(0);
}
p->top++;
p->arr[p->top]= value;
}
void min(pStack p)
{
int min;
int c_top; // 关于top的一个副本,因为虽然函数调用结束,p指针销毁,但是top的值却改变了。c_top保证了top还是在最上方,在pop()时,正确输出结果。
c_top = p->top;
min = p->arr[p->top];
while(p->top != -1)
{
if(p->arr[p->top] < min)
{
min = p->arr[p->top];
}
p->top--;
}
cout << min << endl;
p->top = c_top;
return;
}
//出栈操作
void pop(pStack &p)
{
if( p->top == -1 )
{
cout << "栈已空" << endl;
exit(0);
}
cout<<p->arr[p->top]<<endl;
p->top--;
}
int main()
{
int value;
int num;
int i;
cin>>num;
pStack pointer;
pointer = (pStack)malloc(sizeof(Stack));
pointer->top = -1; // 从-1开始,这样先top++,再放值,从数组下标为0开始。
cout<<"输入"<<num<<"个值"<<endl;
for (i=0; i<num; i++)
{
cin>>value;
push(pointer,value);
}
下面分析如何实现要求函数min、push 以及pop 的时间复杂度都是O(1)
#include <iostream>
using namespace std;
#include <stdlib.h>
#define MAXSIZE 20
typedef struct Stack
{
int arr[MAXSIZE];
int top;
}*pStack;
//用于存储在当前输入中的最小值,当Stack输入为 5 4 3 6 2,minStack值为5 4 3 2
typedef struct minStack
{
int arr[MAXSIZE];
int top;
}*pMinStack;
void push(pStack &p, int value)
{
if( p->top > MAXSIZE-1 )
{
cout << "栈已满,溢出" << endl;
exit(0);
}
p->top++;
p->arr[p->top]= value;
}
void push(pMinStack &p, int value)
{
if( p->top > MAXSIZE-1 )
{
cout << "栈已满,溢出" << endl;
exit(0);
}
p->top++;
p->arr[p->top]= value;
}
int pop(pStack &p)
{
int value;
if( p->top == -1 )
{
cout << "栈已空" << endl;
exit(0);
}
value = p->arr[p->top];
cout<<value<<endl;
p->top--;
return value;
}
int pop(pMinStack &p)
{
int value;
if( p->top == -1 )
{
cout << "栈已空" << endl;
exit(0);
}
value = p->arr[p->top];
cout<<value<<endl;
p->top--;
return value;
}
int Min(int value, pMinStack &pointer)
{
if(value == pointer->arr[pointer->top])
/* 资料上此处为<=,个人认为是==,因为minStack最上方存的为当前最小值。不可能value<pointer->arr[pointer->top]) */
pop(pointer);
}
if(pointer->top == -1)
{
cout<<"MinStack is empty"<<endl;
return -1;
}
else
return pointer->arr[pointer->top];
}
int main()
{
int value;
int num;
int i;
int min;
int sValue;
int tValue;
pStack s;
pMinStack t;
cout<<"输入值个数"<<endl;
cin>>num;
cout<<"输入"<<num<<"个值"<<endl;
cin>>value;
s = (pStack)malloc(sizeof(Stack));
t = (pMinStack)malloc(sizeof(minStack));
s->top = -1;
t->top = -1;
push(s,value);
push(t,value);
for(i=1; i<num; i++)
{
cin>>value;
if( value < t->arr[t->top])
{
push(t, value); // 栈中保存的一直是当前输入数中的最小值。
}
push(s, value);
}
min=t->arr[t->top];
cout<<"最小值为:"<<min<<endl; // 至此已经找到堆栈的最小值
// 下面为动态的,当pop值后,找到当前堆栈的最小值。
while(s->top != -1)
{
cout<<"pop 值:";
sValue=pop(s);
min=Min(sValue,t);
if (min == -1)
{
cout<<" Stack is empty"<<endl;
}
else
{
cout<<"最小值为:"<<min<<endl;
}
}
return 0;
}
本文介绍了一种特殊栈的设计方案,该栈除了具备基本的入栈和出栈功能外,还提供了一个min函数,可以返回栈中的最小元素。文章详细讲解了如何通过维护两个栈来确保min、push及pop操作均能在O(1)时间内完成。
1661

被折叠的 条评论
为什么被折叠?



