2.设计包含min 函数的栈

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

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

即函数min中做push和pop操作时间复杂度都是O(1),定义一个同样大小的栈B用来存放min,原始栈为A。

2、6、4、1、5入栈、出栈对应的min
序号push()push-min()pop()pop-min()
55151
41112
34242
26262
1222NULL
0NULLNULLNULLNULL


即当向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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值