数据结构——队列

目录

1.队列元素逆置

C语言

C++

2.约瑟夫环

3.栈实现队列

4.用队列实现栈


1.队列元素逆置

【问题描述】

已知Q是一个非空队列,S是一个空栈。仅使用少量工作变量以及对队列和栈的基本操作,编写一个算法,将队列Q中的所有元素逆置。

【输入形式】

输入的第一行为队列元素个数,第二行为队列从首至尾的元素

【输出形式】

输出队列的逆置

【样例输入】

3
1 2 3

【样例输出】

3 2 1

【评分标准】

需采用队列与栈的知识,否则不能得分

C语言

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 3000

typedef struct {
    int data[MAX_SIZE];
    int front;
    int rear;
} Queue;

void initQueue(Queue *q) {
    q->front = 0;
    q->rear = -1;
}

int isEmpty(Queue *q) {
    return q->front > q->rear;
}

void enqueue(Queue *q, int item) {
    if (q->rear == MAX_SIZE - 1) {
        printf("Error: Queue is full\n");
        exit(1);
    }
    q->rear++;
    q->data[q->rear] = item;
}

int dequeue(Queue *q) {
    if (isEmpty(q)) {
        printf("Error: Queue is empty\n");
        exit(1);
    }
    int item = q->data[q->front];
    q->front++;
    return item;
}

typedef struct {
    int data[MAX_SIZE];
    int top;
} Stack;

void initStack(Stack *s) {
    s->top = -1;
}

int isStackEmpty(Stack *s) {
    return s->top == -1;
}

void push(Stack *s, int item) {
    if (s->top == MAX_SIZE - 1) {
        printf("Error: Stack is full\n");
        exit(1);
    }
    s->top++;
    s->data[s->top] = item;
}

int pop(Stack *s) {
    if (isStackEmpty(s)) {
        printf("Error: Stack is empty\n");
        exit(1);
    }
    int item = s->data[s->top];
    s->top--;
    return item;
}

void reverseQueue(Queue *q) {
    if (isEmpty(q)) {
        return;
    }
    Stack s;
    initStack(&s);

    while (!isEmpty(q)) {
        push(&s, dequeue(q));
    }

    while (!isStackEmpty(&s)) {
        enqueue(q, pop(&s));
    }
}

int main() {
    Queue q;
    initQueue(&q);

    int size;
    scanf("%d", &size);
    int i;
    for ( i = 0; i < size; i++) {
        int item;
        scanf("%d", &item);
        enqueue(&q, item);
    }
    reverseQueue(&q);

    while (!isEmpty(&q)) {
        printf("%d ", dequeue(&q));
    }
    printf("\n");

    return 0;
}

C++


#include<stdio.h>
int main()
{
	int QUEUE[1000],STACK[1000],i,n,temp,top,front,rear;
	front=rear=top=-1;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&temp);
		rear++;
		QUEUE[rear]=temp;
	}
	for(i=0;i<n;i++)
	{
		temp=QUEUE[++front];
		STACK[++top]=temp;
	}
	while(top!=-1)
	{
		printf("%d ",STACK[top]);
		top--;
	}
	return 0;
}

2.约瑟夫环

【问题描述】

n个人围成一个圈,按顺时针方向一次编号1、2、3、……、n,从第一个人开始顺时针方向依次报数1、2、3、……,报数m的人被淘汰,然后下一个人再从1开始报数,一直重复该过程。由于人数是有限的,因此最后一定只会剩下一个人,求这个人的编号。

【输入形式】

第一行,一个整数n,表示约瑟夫环的总人数。

第二行,一个整数m,表示报到m的人被淘汰。

【输出形式】

 一行,一个整数,约瑟夫环最终剩下的人的编号。

【样例输入】

5
2

【样例输出】

3

【样例说明】

5个人围成一圈,编号1,2,3,4,5;

第一轮,2号淘汰,剩下1,3,4,5;

第二轮,从3开始报数,4号淘汰,剩下1,3,5;

第三轮,从5开始报数,1号淘汰,剩下3,5;

第四轮,从3开始报数,5号淘汰,剩下3。
【评分标准】

通过所有数据

class Queue:
    #initialization
    def __init__(self):
        self.q = []
    
    #入队
    def enqueue(self, num):
        self.q.append(num)
        
    #出队
    def dequeue(self):
        if self.isEmpty():
            return "The queue is EMPTY!"
        else:
            return self.q.pop(0)
        
    def get_len(self):
        return len(self.q)
    
    def isEmpty(self):
        return self.get_len()==0
    
joseph = Queue()
n = int(input())
m = int(input())
for i in range(1,n+1):
    joseph.enqueue(i)



while(joseph.get_len()!=1):
    count = 1
    while(True):
        
        if(count!=m):
            joseph.enqueue(joseph.dequeue())
            count += 1
        else:
            joseph.dequeue()
            break
    

print(joseph.dequeue())

3.栈实现队列

【问题描述】

请使用栈类实现队列的类。

【输入形式】

第一行一个整数n,

接下来n行,每行一个整数,依次表示已经在队列中的数。

接下来一行,一个整数m。

接下来m行,有两种情况:1. 一个整数,请将其入列。2. 字符串"D",表示出列操作。

【输出形式】

若干行,每行一个出列的输出。

【样例输入】

3
1
2
3
2
4
D

【样例输出】

1

【样例说明】

队列中原来有1,2,3三个数,第一个操作使4入列,第二个操作出列,弹出队头的1
【评分标准】

通过所有数据

class Stack:
    def __init__(self):
        self.s = []
        
    def push(self, num):
        self.s.append(num)
    
    def out(self):
        return self.s.pop()
    
    def empty(self):
        return len(self.s)==0
    
    
class Queue:
    def __init__(self):
        self.s1 = Stack()
        self.s2 = Stack()
        
    def enq(self, num):
        self.s1.push(num)
        
    def deq(self):
        while(not self.s1.empty()):
            self.s2.push(self.s1.out())
        temp= self.s2.out()
        while(not self.s2.empty()):
            self.s1.push(self.s2.out())
        return temp

n = int(input())
q = Queue()
for i in range(n):
    q.enq(int(input()))

m = int(input())
for i in range(m):
    op = input()
    if op.isdigit():
        q.enq(int(op))
    elif op=="D":
        print(q.deq())

4.用队列实现栈

【问题描述】

用队列实现一个栈。本题要求使用队列实现栈,其他实现方式不计分。
【输入形式】

第一行输入数n,接下来n行输入一些数,表示已经在栈里的数

接下来输入数m,接下来m行输入指令,A表示入栈,B表示出栈,具体看样例
【输出形式】

第一行输出弹出栈的数字们,用空格隔开

第二行弹出栈内剩余的数,并用空格隔开
【样例输入】

3
1
2
3
5
A 5
A 6
B 
B
B

【样例输出】

6 5 3
2 1

【样例说明】

出现异常还是输出一行‘No’
【评分标准】

class SQueue(object):
	def __init__(self, init_len=8):
		self.__elem = [0] * init_len
		self.__len = init_len
		self.__head = 0
		self.__num = 0


	def __extend(self):
		old_len = self.__len
		self.__len *= 2
		new_elems = [0] * self.__len
		for i in range(old_len):
			new_elems[i] = self.__elem[(self.__head + i) % old_len]
		self.__elem, self.__head = new_elems, 0


	def is_empty(self):
		return self.__num == 0


	def peek(self):
		if self.__num == 0:
			raise QueueUnderflow
		return self.__elem[self.__head]


	def enqueue(self, e):
		if self.__num == self.__len:
			self.__extend()
		self.__elem[(self.__head + self.__num) % self.__len] = e
		self.__num += 1
		
		
	def dequeue(self):
		if self.__num == 0:
			raise QueueUnderflow
		e = self.__elem[self.__head]
		self.__head = (self.__head + 1) % self.__len
		self.__num -= 1
		return e

	def get_elem(self):
		print(self.__elem)


class Stack():
	def __init__(self):
		self.__stack = SQueue()
		self.__temp = SQueue()


	def push(self, e):
		while not self.__stack.is_empty():
			self.__temp.enqueue(self.__stack.dequeue())
		self.__stack.enqueue(e)
		while not self.__temp.is_empty():
			self.__stack.enqueue(self.__temp.dequeue())


	def pop(self):
		return self.__stack.dequeue()


	def is_empty(self):
		return self.__stack.is_empty()



n = int(input())
stack = Stack()
for i in range(n):
	stack.push(int(input()))
mark = 0
tmp = []
m = int(input())
for i in range(m):
	o = input()
	if 'A' in o:
		o = int(o.strip().split()[1])
		stack.push(o)
	elif 'B' in o:
		try:
			tmp += [stack.pop()]
		except:
			mark = 1
			break
if mark == 1:
	print('No')
else:
	tmp = [str(i) for i in tmp]
	print(' '.join(tmp))
	_ = []
	while not stack.is_empty():
		_ += [str(stack.pop())]
	print(' '.join(_))

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值