-
题目描述:
-
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的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;
}