代码如下,已通过oj,想求教一下代码如何改进?
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef int QElemType;
typedef struct StackNode
{
int data;
struct StackNode *next;
}StackNode,*LinkStack;
Status InitStack(LinkStack &S)
{
S=NULL;
return OK;
}
Status Push(LinkStack &S,int e)
{
StackNode *p=(StackNode*)malloc(sizeof(StackNode));
p->data=e;
p->next=S;
S=p;
return OK;
}
Status Pop(LinkStack &S,int &e)
{
if(!S)
{
return ERROR;
}else
{
StackNode *p=S;
e=S->data;
S=S->next;
delete p;
return OK;
}
}
int GetTop(LinkStack S)
{
if(S)
{
return S->data;
}
}
//链栈基本操作
int main()
{
LinkStack S;
InitStack(S);
int n,i,t=0,e,g,maxs;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++)//输入数据
{
scanf("%d",&a[i]);
}
while(S||t<n)//循环确保序列中数据用完
{
for(i=t;i<n;i++)//判断未入栈数据最大值
{
if(a[i]>maxs)
{
maxs=a[i];
g=i;
}
}
if(!S||GetTop(S)<maxs)//最大值与栈顶元素比较或栈空
{
printf("%d ",maxs);
maxs=0;//初始化最大值
for(i=t;i<g;i++)
{
Push(S,a[i]);//最大值前所有数据入栈
}
t=g+1;//为下一次判断未入栈数据最大值定起点
}else
{
Pop(S,e);//否则出栈并将下一个栈顶元素与最大值比较
printf("%d ",e);
}
}
}