题目:
设计一个算法将所有奇数元素放到偶数元素前面。
思路分析:
由于一个数组中既有奇数,又有偶数,因此,首先需要采取的是将数组中的元素进行奇偶分类。可以用两个栈分别存储奇数和偶数。
解析:
首先有栈的基本算法。
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct
{
ElemType data[MaxSize];
int top;
}SqStack;
void InitStack(Stack *&s) //初始化栈
{
s=(SqStack *)malloc(sizeof(SqStack)); //分配一个顺序栈空间,首地址存放在s中
s->top=-1; //栈顶指针置-1
}
void DestroyStack(SqStack *&s) //销毁栈
{
free(s);
}
bool StackEmpty(SqStack *s) //判断栈是否为空
{
return(s->top==-1);
}
bool Push(SqStack *&s,ElemType e) //进栈
{
if(s->top==MaxSize-1) return false; //栈满的情况,即上溢出
s->top++; //栈顶指针增1
s->data[s->top]=e; //元素e放在栈顶指针处
return true;
}
bool Pop(SqStack *&s,ElemType &e)
{
if(s->top==-1) return false; //栈为空的情况,即栈下溢出
e=s->data[s->top]; //取栈顶元素
s->top--; //栈顶指针减1
return true;
}
bool GetTop(SqStack *s,ElemType &e)
{
if(s->top==-1) return false; //栈为空的情况,即栈下溢出
e=s->data[s->top]; //取栈顶元素
return true;
}
接下来用两个栈分别存储奇数和偶数。
void fun(ElemType a[],int n)
{
int i;
ElemType e;
SqStack *st1,*st2; //分别定义两个栈st1,st2
InitStack(st1); //初始化两个栈
InitStack(st2);
for(i=0;i<n;i++) //循环遍历数组a
if(a[i]%2==1) Push(st1,a[i]); //若该数为奇数,进栈到st1
else Push(st2,a[i]); //若该数为偶数,进栈到st2
i=0;
while(!StackEmpty()) //循环条件为栈非空
{
Pop(st1,e); //将奇数出栈
a[i++]=e; //将奇数存入数组
}
while(!StackEmpty()) //当循环条件为栈非空
{
Pop(st2,e); //将偶数出栈
a[i++]=e; //将偶数存入数组
}
DestroyStack(st1); //销毁栈st1
DestroyStack(st2); //销毁栈st2
}
步骤说明:
1) 扫描数组a,将所有奇数进到s1栈中,将所有偶数进到s2栈中
2) 先将st1中的所有元素(奇数元素)退栈,放到数组a中,并覆盖原有位置的元素,再将st2的所有元素(偶数元素)退栈,放到数组a中并覆盖原有位置的元素
3)销毁两个栈st1和st2
所以本算法的功能是利用两个栈将数组a中的所有奇数元素放到所有偶数前面