题目:
实现一个特殊的栈,在实现栈的基本功能基础上,在实现返回栈中最小元素的操作。
代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct stack
{
int data[100];
int top;
}Stack,*pStack;
//初始化顺序栈
void InitStack(pStack pstack)
{
pstack->top = -1;
return;
}
void push(pStack pstackdata,pStack pstackmin,int val)
{
int temp;
if(99 == pstackdata->top)
return;
if(pstackmin->top < 0)
{
pstackmin->top += 1;
pstackmin->data[pstackmin->top] = val;
}
else if(pstackmin->data[pstackmin->top] > val)
{
pstackmin->top += 1;
pstackmin->data[pstackmin->top] = val;
}
else
{
temp = pstackmin->data[pstackmin->top];
pstackmin->top += 1;
pstackmin->data[pstackmin->top] = temp;
}
(pstackdata->top)++;
pstackdata->data[pstackdata->top] = val;
return;
}
void pop(pStack pstackdata,pStack pstackmin)
{
if(pstackdata->top < 0)
{
printf("stack empty! pop stack failure\n");
return;
}
printf("pop stack data is %d\n",pstackdata->data[pstackdata->top]);
(pstackdata->top)--;
printf("pop stack min is %d\n",pstackmin->data[pstackmin->top]);
(pstackmin->top)--;
printf("\n");
}
void Travel(pStack pstack)
{
int i;
if(-1==pstack->top)
printf("Stack empty1\n");
for(i=0;i<=pstack->top;i++)
printf("%d",pstack->data[i]);
printf("\n");
}
int getmin(pStack pstackmin)
{
return pstackmin->data[pstackmin->top];
}
int main()
{
Stack stackdata,stackmin;
InitStack(&stackdata);
InitStack(&stackmin);
push(&stackdata,&stackmin,2);
push(&stackdata,&stackmin,1);
push(&stackdata,&stackmin,9);
push(&stackdata,&stackmin,0);
push(&stackdata,&stackmin,3);
Travel(&stackdata);
Travel(&stackmin);
pop(&stackdata,&stackmin);
pop(&stackdata,&stackmin);
pop(&stackdata,&stackmin);
pop(&stackdata,&stackmin);
pop(&stackdata,&stackmin);
pop(&stackdata,&stackmin);
printf("%d",getmin(&stackmin));
return 0;
}
其中容易错误的地方是:将pstackmin->data[pstackmin->top]写成pstackmin->data[top]。
push的思想是:stackdata是用来存放数据data,stackmin用来存放从栈底到当前元素的最小值。
1.如果stackmin为空或者data 比stackmin的栈顶元素小,直接将当前的data push到stackmin中。
2.如果data比stackmin的栈顶元素大,那么将stackmin的栈顶元素重复压入。
pop的思想:
与一般的栈的操作基本相同,只是同时将stackdata 与 stackmin的栈顶元素同时弹出。
getmin的思想:
stackmin的栈顶元素永远是stackdata的最小值
另外再加一种c++实现的代码:
class Solution
{
private:
stack<int> Stackdata;
stack<int> Stackmin;
public:
void push(int value)
{
Stackdata.push(value);
if(Stackmin.empty() || (value < Stackmin.top()))
Stackmin.push(value);
else
Stackmin.push(Stackmin.top());
}
void pop()
{
Stackdata.pop();
Stackmin.pop();
}
int top()
{
return Stackdata.top();
}
int min()
{
return Stackmin.top();
}
};