matlab中元素逆序怎么编写,C语言利用队列的操作实现队列中元素的逆置(逆序输出)...

C语言利用队列的操作实现队列中元素的逆置(逆序输出)

题目均在sdibt acm oj上AC,参考《深入浅出数据结构和算法》教材,欢迎评论指正!

Description

假设队列中有n个整数,编写算法实现将队列中的元素逆置,要求利用栈实现。

要求:

(1)编写函数分别实现队列初始化、判断队空、判断队满、入队、出队的操作;

(2)编写函数分别实现栈的初始化、判断栈空、栈满、入栈、出栈操作;

(3)主函数调用上述函数,实现所给问题。

Input

输入队列中元素的个数n

依次输入n个数,建立队列。

Output

依次输出逆置后的队列中的元素。

Sample Input6

1 2 3 4 5 6

Sample Output6 5 4 3 2 1

HINT

若想完成逆置,并且使用队列和栈的操作,我们必须使用队列的先进先出原则,和栈的先进后出原则。

那么我们两者结合,使用栈来逆置,逆置后的元素随即入队,最后对队列进行一个输出元素的操作,这样就能完成逆置这一操作。

结构体定义如下,队列+栈:#include

#include

#define MAXSIZE 20

#define STACK_SIZE 30

///

//定义队列的结构体

typedef struct Squeue{

int data[MAXSIZE];//队列内元素的最大长度

int front;//队头

int rear;//队尾

}Squeue;

//定义栈(顺序栈)的结构体

typedef struct{

int *base;

int *top; //栈顶指针

int size;

}seqStack;

///

栈的基本几个操作:初始化、出入栈、取栈顶元素int InitStack(seqStack *s){

s->base = (int *)malloc(STACK_SIZE* sizeof(seqStack));//动态分配30个单位的stack

//省略是否空间满

s->top = s->base;//栈顶和栈尾相同,栈里面没有元素

s->size = STACK_SIZE;

return 1;

}

int Push(seqStack *s,int x){

*s->top = x;

s->top++;

return 1;

}

int Pop(seqStack *s,int *x){

if(s->top == s->base)return 0;

else{

s->top--;

*x = *s->top;

return 1;

}

}

int GetTop(seqStack *s, int *x){

if(s->top==s->base)

return 0;

else{

*x=*(s->top-1);

return 1;

}

}

队列的几个基本操作:初始化、判断空状态、出入队//初始化队列

void InitQueue(Squeue *Q)

{

Q->front = Q->rear = 0;

}

//判断队列是否为空

int isQueueEmpty(Squeue *qu)

{

if(qu->front == qu->rear)

{

return 1;

}

else

{

return 0;

}

}

//元素入队操作

int EnQueue(Squeue *qu,int x)

{

//若队满则无法入队——当前个数已经超过最大数量,

//就会出现mod(Maxsize)的结果是队头指针

//比如,队头是1,最大长度是12,若入队第13个元素,则会出现13mod12==1(和队头相等)的情况

//这样就会return false

if((qu->rear + 1) % MAXSIZE == qu->front)

{

return 0;

}

qu->rear = (qu->rear + 1) % MAXSIZE;

qu->data[qu->rear] = x;

return 1;

}

//元素出队操作

int deQueue(Squeue *qu,int *x)

{

//若队空则无法出队

if(qu->front == qu->rear)

{

return 0;

}

qu->front = (qu->front + 1) % MAXSIZE;

*x = qu->data[qu->front];

return 1;

}

主函数:入栈->出栈、入队->出队输出完成逆置int main()

{

int i , n , x , a;

scanf("%d",&n);

Squeue q;

seqStack s;

InitStack(&s);

InitQueue(&q);

//顺序的入栈

for(i = 0;i < n;i++)

{

scanf("%d",&a);

Push(&s,a);

}

int stackNumber;

for(i=0;i

{

Pop(&s,&stackNumber);//逆序的出栈(遵顼先进后出原则)

EnQueue(&q,stackNumber);//逆序的入队

}

while(!isQueueEmpty(&q))

{

deQueue(&q,&x);//逆序的出队(遵循先进先出原则)

printf("%d ",x);//完成逆转,输出!

}

return 0;

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值