设计包含min 函数的栈。
定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。
即当向A中push 的元素比B 中当前的元素小, 则把这个元素push 进B,即更新B。否则,不动B,保存原值。如push(1)时,B中当前最小值为2,则更新最小值把该值入B中,否则如push(4)时,仍把以前不变的值2放入B中。
pop_min:1 2 2 2 0
定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。
要求函数min、push 以及pop 的时间复杂度都是O(1)。
即函数min中做push和pop操作时间复杂度都是O(1),定义一个同样大小的栈B用来存放min,原始栈为A。
序号 | push() | push-min() | pop() | pop-min() |
5 | 5 | 1 | 5 | 1 |
4 | 1 | 1 | 1 | 2 |
3 | 4 | 2 | 4 | 2 |
2 | 6 | 2 | 6 | 2 |
1 | 2 | 2 | 2 | NULL |
0 | NULL | NULL | NULL | NULL |
即当向A中push 的元素比B 中当前的元素小, 则把这个元素push 进B,即更新B。否则,不动B,保存原值。如push(1)时,B中当前最小值为2,则更新最小值把该值入B中,否则如push(4)时,仍把以前不变的值2放入B中。
而pop()时,则则输出它的下一个对应的min()值。如pop(1),1对应的序号为4,则输出min(4-1),因为pop()该序号n+1值时,则min()为该数的序号的前n个值。故min(0)为NULL;
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
struct stack
{
int data[MAX];
int top;
int bottom;
}A,B;
void initstack()
{
A.top=0;
A.bottom=0;
A.data[0]=NULL;
B.top=0;
B.bottom=0;
B.data[0]=NULL;
}
void push(int key)
{
if (A.top==0)//min第一个值赋值
{
B.data[++B.top]=key;
}
else
{
if (key<B.data[B.top])//B中对应的值更新
B.data[++B.top]=key;
else//B中对应的值不变
{
B.data[B.top+1]=B.data[B.top];
B.top++;
}
}
A.data[++A.top]=key;
}
void pop()
{
if (A.top>=A.bottom)
{
A.data[--A.top];
printf("%d ",B.data[--B.top]);
}
}
int main()
{
int i;
initstack();
push(2);
push(6);
push(4);
push(1);
push(5);
printf("push:");
for (i=1; i<=A.top; i++)
printf("%d ",A.data[i]);
printf("\n");
printf("pop_min:");
for (i=1; i<=5; i++)
{
pop();
}
system("pause");
}
push:2 6 4 1 5
pop_min:1 2 2 2 0