请教一下我这个栈始终都有逻辑问题求最完美的算法能在任何时候都知道栈的最大值
#include<stdio.h>#include<stdlib.h>
#define NULL 0
#define OVERFLOW -1
#define OK 1
#define ERROR -2
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct{
int *base;
int *top;
int stacksize;
}SqStack;
int InitStack(SqStack &S){
S.base=(int *)malloc(STACK_INIT_SIZE *sizeof(int));
if(!S.base )exit(OVERFLOW);
S.top =S.base ;
S.stacksize =STACK_INIT_SIZE;
return OK;
}
int Push(SqStack &S,int e){
if(S.top -S.base>=S.stacksize ){
S.base =(int *)realloc(S.base ,(S.stacksize +STACKINCREMENT)*sizeof(int));
if(!S.base )exit(OVERFLOW);
S.top =S.base +S.stacksize ;
S.stacksize +=STACKINCREMENT;
}
*S.top ++=e;
return OK;
}
int Pop (SqStack &S, int &e) {
// 若栈不空,则删除S的栈顶元素,
// 用 e 返回其值,并返回OK;
// 否则返回ERROR
if (S.top == S.base) return ERROR;
e = *--S.top;
return OK;
}
int StackEmpty (SqStack S) {
return (S.top ==S.base );
}
int GetTop(SqStack &S,int &e){
if(S.top ==S.base )return ERROR;
e=*(S.top -1);
return OK;
}
void main(){
int e,e_max,status=0;
SqStack S,S_max;
InitStack(S);
InitStack(S_max);
printf("请输入数值,当值为正时压栈,当值为负数时弹栈,当值为0时退出。\n");
while(e){
scanf("%d",&e);
if(e>0){
Push(S,e); //压栈
if(S_max.top ==S_max.base ){//当栈为空
Push(S_max,e);//把e压栈,此时e为第一个元素
printf("最大值为:%d\n",e);}
else{
GetTop(S_max,e_max);
if(e>e_max){
Push(S_max,e);
printf("最大值为:%d\n",e);}
else if(e<e_max){
printf("最大值为:%d\n",e_max);}
}
}
else if(e<0){
if(S.top ==S.base ){printf("栈为空\n");}
else{
GetTop(S,e);//S不空
Pop(S,e);//退栈后判断S是只有一个元素还是几个元素
if(S.top ==S.base ){//当原来的S中只有一个元素时
GetTop(S_max,e_max);
Pop(S_max,e_max);
printf("栈为空");}
else{//当原来S中有两个及多个元素时
GetTop(S_max,e_max);
if(e==e_max){//如果退栈的元素等于最大值
Pop(S_max,e_max);
GetTop(S_max,e_max);
printf("最大值为:%d\n",e_max);}
else{
printf("最大值为:%d\n",e_max);}
}
}
}
else if(e==0){OVERFLOW;}
status++;
}