码迷,mamicode.com
首页 > 其他好文 > 详细

包含min方法的栈

时间:2014-08-02 15:30:53      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:des   style   使用   os   strong   io   数据   for   

题目描述:

定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。

输入:

输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行为一个整数n(1<=n<=1000000), n代表将要输入的操作的步骤数。
接下来有n行,每行开始有一个字母Ci。
Ci=’s’时,接下有一个数字k,代表将k压入栈。
Ci=’o’时,弹出栈顶元素。

输出:

对应每个测试案例中的每个操作,
若栈不为空,输出相应的栈中最小元素。否则,输出NULL。

样例输入:
7
s 3
s 4
s 2
s 1
o
o
s 0
样例输出:
3
3
2
1
2
3
0
思路:
使用辅助栈一枚。用于记录当前数据栈中最小值。详见代码。

代码:

/*
包含min函数的栈
by Rowandjj
2014/8/2
*/
#include<stdio.h>
#include<stdlib.h>
//-------------栈基本定义及实现--------------------
typedef struct _SNODE_
{
	int data;
	struct _SNODE_ *next;
}Node,*pNode;
typedef struct _STACK_
{
	pNode pHead;
	int size;
}Stack,*pStack;
void InitStack(pStack ps)
{
	ps->pHead = (pNode)malloc(sizeof(Node));
	if(ps->pHead == NULL)
	{
		exit(-1);
	}
	ps->pHead->next = NULL;
	ps->size = 0;
}
void Push(pStack ps,int data)
{
	if(ps == NULL)
	{
		return;
	}
	pNode pNew = (pNode)malloc(sizeof(Node));
	if(!pNew)
	{
		exit(-1);
	}
	pNew->data = data;
	pNew->next = ps->pHead->next;
	ps->pHead->next = pNew;
	ps->size++;
}
void Pop(pStack ps,int *data)
{	
	if(ps == NULL)
	{
		*data = -1;
		return;
	}
	pNode pDel = ps->pHead->next;
	if(pDel == NULL)
	{
		*data = -1;
		return;
	}
	*data = pDel->data;
	ps->pHead->next = pDel->next;
	free(pDel);
	ps->size--;
}
void Destroy(pStack ps)
{
	if(ps == NULL)
	{
		return;
	}
	pNode p,q;
	p = ps->pHead;
	while(p != NULL)
	{
		q = p->next;
		free(p);
		p = q;
	}
	ps->size = 0;
	ps = NULL;
}
bool Top(pStack ps,int *data)
{
	if(ps == NULL || ps->size == 0)
	{
		*data = -1;
		return false;
	}
	else
	{
		*data = ps->pHead->next->data;
		return true;
	}
}
//------------------------------------
//ps是数据栈,pMin是辅助栈,用于存储最小值
void StackWithMin_Push(pStack pS,pStack pMin,int data)
{
/*
	1.data压入数据栈
	2.当辅助栈为空或者辅助栈栈顶元素小于当前入栈元素data,将data
	压入辅助栈,否则继续压入辅助栈栈顶元素
*/
	if(pS == NULL || pMin == NULL)
	{
		return;
	}
	Push(pS,data);
	int top;
	Top(pMin,&top);
	if(pMin->size == 0)
	{
		Push(pMin,data);
	}
	else if(data < top)
	{
		Push(pMin,data);
	}
	else
	{
		Push(pMin,top);
	}
}
void StackWithMin_Pop(pStack pS,pStack pMin)
{
	/*
	分别在两个栈中弹出栈顶元素
	*/
	if(pS == NULL || pMin == NULL || pS->size <= 0 || pMin->size <= 0)
	{
		return ;
	}
	int data,temp;
	Pop(pS,&data);
	Pop(pMin,&temp);
}
//输出最小值
bool StackWithMin_Min(pStack pS,pStack pMin,int *min)
{
	/*
	辅助栈栈顶即为最小元素
	*/
	if(pS == NULL || pMin == NULL || pS->size <= 0 || pMin->size <= 0)
	{
		return false;
	}
	Top(pMin,min);
	return true;
}
int main()
{
	Stack s,minS;
	InitStack(&s);
	InitStack(&minS);
	int n;
	while(scanf("%d",&n) != EOF)
	{
		if(n <= 0)
		{
			continue;
		}
		for(int i = 0; i < n; i++)
		{
			int data;
			while(getchar() != '\n')  
                continue;  
			char c;
			scanf("%c",&c);
			if(c == 's')
			{
				scanf("%d",&data);
				StackWithMin_Push(&s,&minS,data);
				int min;
				if(StackWithMin_Min(&s,&minS,&min))
				{
					printf("%d\n",min);
				}else
				{
					printf("NULL\n");
				}
				
			}else if(c == 'o')
			{
				StackWithMin_Pop(&s,&minS);
				int min;
				if(StackWithMin_Min(&s,&minS,&min))
				{
					printf("%d\n",min);
				}else
				{
					printf("NULL\n");
				}
			}
		}
	}
	Destroy(&s);
	Destroy(&minS);
	return 0;
}




包含min方法的栈,布布扣,bubuko.com

包含min方法的栈

标签:des   style   使用   os   strong   io   数据   for   

原文地址:http://blog.csdn.net/chdjj/article/details/38348569

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!