c语言输入奇数入队偶数出队,顺序栈S中有2n个元素,从栈顶到栈底的元素依次为a2n、a2n-1、…、a1。试设计一个算法:通过一个循环队列重新排列该栈中的元素,使得从栈顶到栈底的元素先偶数,后奇数...

该程序使用C语言通过顺序栈和循环队列,实现了一个功能:将一个栈中2n个元素按偶数在前、奇数在后的顺序重新排列。首先将栈中的元素依次出栈并入队,然后判断队列中的元素是否为偶数,偶数再入队,奇数则回栈。最后,将队列中的元素回栈,达到目标顺序。
摘要由CSDN通过智能技术生成

#include

#include

#define STACK_INIT_SIZE 100

#define QUEUE_MAX_SIZE 100

#define STACK_INCREMENT 10

using namespace std;

typedef struct Stack //结构体定义

{

int *elem; //数据域

int top; //顺序栈栈顶

int stacksize; //顺序栈当前长度

}Stack;

typedef struct Sqqueue //循环队列结构体定义

{

int *data;

int front;

int rear;

}Sqqueue;

//公共函数声明

void Error(char *s); //错误处理函数

void Reset(); //重置函数

//顺序栈函数声明

Stack Creat_Stack(); //若干个元素的顺序栈

void Destroy_Stack(Stack & l); //销毁顺序栈

void Push_Stack(Stack &L, int e); //压栈操作函数

int Pop_Stack(Stack &L, int e); //出栈操作函数

void Increment_Stack(Stack & l); //增加顺序栈空间函数

void Print_Stack(Stack & l); //输出顺序栈元素函数、

//循环队列函数声明

void Init_Sqqueue(Sqqueue &q); //初始化循环队列</

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这道题目是要求我们一个循环队列重新排列元素,使得从栈顶栈底元素依次a2n,a2n-2,…,a4,a2, a2n-1, a2n-3, …,a3,a1。具体实现方法如下: 1.首将栈元素依次出栈,并将其放入一个队列。 2.然后将队列元素依次出队,并将其放入另一个队列。 3.将第二个队列元素依次出队,并将其放入栈。 4.最后将栈元素依次出栈,并将其放入第一个队列。 5.将第一个队列元素依次出队,并输出即可。 下面是C语言的实现代码: ``` #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 typedef struct { int data[MAXSIZE]; int top; } Stack; typedef struct { int data[MAXSIZE]; int front, rear; } Queue; void InitStack(Stack *S) { S->top = -1; } int IsEmpty(Stack *S) { return S->top == -1; } int IsFull(Stack *S) { return S->top == MAXSIZE - 1; } void Push(Stack *S, int x) { if (IsFull(S)) { printf("Stack is full.\n"); return; } S->data[++S->top] = x; } int Pop(Stack *S) { if (IsEmpty(S)) { printf("Stack is empty.\n"); return -1; } return S->data[S->top--]; } void InitQueue(Queue *Q) { Q->front = Q->rear = 0; } int IsEmptyQueue(Queue *Q) { return Q->front == Q->rear; } int IsFullQueue(Queue *Q) { return (Q->rear + 1) % MAXSIZE == Q->front; } void EnQueue(Queue *Q, int x) { if (IsFullQueue(Q)) { printf("Queue is full.\n"); return; } Q->data[Q->rear] = x; Q->rear = (Q->rear + 1) % MAXSIZE; } int DeQueue(Queue *Q) { if (IsEmptyQueue(Q)) { printf("Queue is empty.\n"); return -1; } int x = Q->data[Q->front]; Q->front = (Q->front + 1) % MAXSIZE; return x; } void Exchange(Stack *S, int n) { Queue Q1, Q2; InitQueue(&Q1); InitQueue(&Q2); for (int i = 0; i < n; i++) { EnQueue(&Q1, Pop(S)); } for (int i = 0; i < n; i++) { EnQueue(&Q2, DeQueue(&Q1)); } for (int i = 0; i < n; i++) { Push(S, DeQueue(&Q2)); } for (int i = 0; i < n; i++) { EnQueue(&Q1, Pop(S)); } for (int i = 0; i < n; i++) { EnQueue(&Q2, DeQueue(&Q1)); EnQueue(&Q2, DeQueue(&Q1)); } for (int i = 0; i < 2 * n; i++) { Push(S, DeQueue(&Q2)); } } int main() { Stack S; InitStack(&S); int n, x; scanf("%d", &n); for (int i = 0; i < 2 * n; i++) { scanf("%d", &x); Push(&S, x); } Exchange(&S, n); for (int i = 0; i < 2 * n; i++) { printf("%d ", Pop(&S)); } printf("\n"); return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值