【栈的应用】奇偶分类

题目:

    设计一个算法将所有奇数元素放到偶数元素前面。

思路分析:

    由于一个数组中既有奇数,又有偶数,因此,首先需要采取的是将数组中的元素进行奇偶分类。可以用两个栈分别存储奇数和偶数。

解析:

   首先有栈的基本算法。

#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中的所有奇数元素放到所有偶数前面 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风雪心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值