队列和栈

 队列是一种特殊的线性表,只允许在表的前端进行删除操作,而在表的后端进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。当队列中没有元素时,称为空队列。

对于队列这种结构,其操作很简单,主要有以下几种:

初始化队列:创建一个队列。

进队列:将一个元素添加到队尾(相当于到队列最后排队等候)。

出队列:将队头的元素取出,同时删除该元素,使后一个元素成为队头。

获取队列第1个元素:将队头的元素取出,不删除该元素(队头仍然是该元素)。

获取队列长度:根据队头、队尾计算出队列中元素的数量。

 数据结构_队列java源代码 

package com.struct.www;

/**
 * @author 丹青
 *
 */
public class Queue {
 //队列容量
 private int maxSize;
 //队列存储数组
 private long[]array;
 //队头"指针"
 private int front;
 //队尾"指针"
 private int rear;
 //队列元素个数
 private int numItem;
 /**
  * @param args
  */
 //构造函数
 Queue(int max){
  maxSize = max;
  array = new long[max];
  front = 0;
  rear = -1;
  numItem = 0;
 }
 //入队,插入元素
 public boolean insert(long value){
 //处理方式,如果队列未满,则可以顺利插入元素,返回true,否则插入队列不成功,返回false

 //个人认为这种处理方式是合适的,好比你去火车站排队,发现前面的人太多,你肯定会走掉的
  if(numItem<maxSize){
  if(maxSize-1==rear){
   rear=-1;
  }
  array[++rear]=value;
  numItem++;
  return true;
  }
  return false;
 }
 //出队,返回队头元素
 public long remove(){
     long result = array[front++];
     if(maxSize==front){
      front=0;
     }
     numItem--;
     return result;
 }
 //不出队,返回队头元素
 public long peekFront(){
  return array[front];
 }
 //判断队列是否为空
 public boolean isEmpty(){
  return (0==numItem);
 }
 //判断队列是否充满
 public boolean isFull(){
  return (maxSize==numItem);
 }
 //返回队列实际长度
 public int size(){
  return numItem;
 }
 //显示队列,从队列头到队列尾
 public void display(){
  //队列不会循环到数组头
  if(numItem<=maxSize-front){
     for(int i=0;i<numItem;i++){
       System.out.print(array[front+i]+" ");
      }
     System.out.println("");
     return;
  }else{
  //队列会循环到数组头
     for(int j=front;j<maxSize;j++){
       System.out.print(array[j]+" ");
     }
     for(int k=0;k<=rear;k++){
       System.out.print(array[k]+" ");
     }
     System.out.println("");}
 }
 public static void main(String[] args) {
  // TODO Auto-generated method stub
     //测试队列数据结构
  Queue queue = new Queue(6);
  queue.insert(1);
  queue.insert(2);
  queue.insert(3);
  queue.insert(4);
  queue.insert(5);
  queue.insert(6);
  //下面的插入不成功
  queue.insert(7);
  queue.display();
  //移出两个元素再显示
  queue.remove();
  queue.remove();
  queue.display();
  //再插入三个元素然后显示,队列只能再插入两个元素
  queue.insert(1);
  queue.insert(2);
  queue.insert(3);
  queue.display();
 }

}

队列测试结果

1 2 3 4 5 6
3 4 5 6
3 4 5 6 1 2

 

 

栈是一种线性表的特殊表现形式,与队列的“先进先出”不同,栈是按照“后进先出”(Last In Firt Out,LIFO)的原则处理数据。

栈的基本操作只有两个:

1、入栈(Push):即将数据保存到栈顶。进行该操作前,先修改栈顶指针,使其向上移一个元素位置,然后将数据保存到栈顶指针所指的位置。

2、 出栈(Pop):即将栈顶的数据弹出,然后修改栈顶指针,使其指向栈中的下一个元素。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中可以使用数组或链表来实现队列。 1. 队列 使用数组实现队列,需要定义一个指向队列头的指针front和一个指向队列尾的指针rear,队列的长度为maxsize。具体实现如下: ``` #define MAXSIZE 100 typedef struct { int data[MAXSIZE]; int front, rear; } Queue; void initQueue(Queue *q) { q->front = q->rear = 0; } int isQueueFull(Queue *q) { return (q->rear + 1) % MAXSIZE == q->front; } int isQueueEmpty(Queue *q) { return q->front == q->rear; } void enqueue(Queue *q, int x) { if (isQueueFull(q)) { printf("Queue is full\n"); return; } q->data[q->rear] = x; q->rear = (q->rear + 1) % MAXSIZE; } int dequeue(Queue *q) { if (isQueueEmpty(q)) { printf("Queue is empty\n"); return -1; } int x = q->data[q->front]; q->front = (q->front + 1) % MAXSIZE; return x; } ``` 其中,initQueue函数用于初始化队列;isQueueFull函数和isQueueEmpty函数分别用于判断队列是否已满和是否为空;enqueue函数用于入队;dequeue函数用于出队。注意,在队列满或空时,需要对应处理。 使用链表实现队列,需要定义一个链表节点Node,以及一个指向队列头节点和队列尾节点的指针head和tail。具体实现如下: ``` typedef struct Node { int data; struct Node *next; } Node; typedef struct { Node *head, *tail; } Queue; void initQueue(Queue *q) { q->head = q->tail = NULL; } int isQueueEmpty(Queue *q) { return q->head == NULL; } void enqueue(Queue *q, int x) { Node *newNode = (Node *)malloc(sizeof(Node)); newNode->data = x; newNode->next = NULL; if (isQueueEmpty(q)) { q->head = q->tail = newNode; } else { q->tail->next = newNode; q->tail = newNode; } } int dequeue(Queue *q) { if (isQueueEmpty(q)) { printf("Queue is empty\n"); return -1; } int x = q->head->data; Node *temp = q->head; q->head = q->head->next; if (q->head == NULL) { q->tail = NULL; } free(temp); return x; } ``` 其中,initQueue函数用于初始化队列;isQueueEmpty函数用于判断队列是否为空;enqueue函数用于入队;dequeue函数用于出队。注意,在队列为空时,需要对应处理。 2. 使用数组实现,需要定义一个指向顶的指针top,的长度为maxsize。具体实现如下: ``` #define MAXSIZE 100 typedef struct { int data[MAXSIZE]; int top; } Stack; void initStack(Stack *s) { s->top = -1; } int isStackFull(Stack *s) { return s->top == MAXSIZE - 1; } int isStackEmpty(Stack *s) { return s->top == -1; } void push(Stack *s, int x) { if (isStackFull(s)) { printf("Stack is full\n"); return; } s->top++; s->data[s->top] = x; } int pop(Stack *s) { if (isStackEmpty(s)) { printf("Stack is empty\n"); return -1; } int x = s->data[s->top]; s->top--; return x; } ``` 其中,initStack函数用于初始化;isStackFull函数和isStackEmpty函数分别用于判断是否已满和是否为空;push函数用于入;pop函数用于出。注意,在满或空时,需要对应处理。 使用链表实现,需要定义一个链表节点Node,以及一个指向顶节点的指针top。具体实现如下: ``` typedef struct Node { int data; struct Node *next; } Node; typedef struct { Node *top; } Stack; void initStack(Stack *s) { s->top = NULL; } int isStackEmpty(Stack *s) { return s->top == NULL; } void push(Stack *s, int x) { Node *newNode = (Node *)malloc(sizeof(Node)); newNode->data = x; newNode->next = s->top; s->top = newNode; } int pop(Stack *s) { if (isStackEmpty(s)) { printf("Stack is empty\n"); return -1; } int x = s->top->data; Node *temp = s->top; s->top = s->top->next; free(temp); return x; } ``` 其中,initStack函数用于初始化;isStackEmpty函数用于判断是否为空;push函数用于入;pop函数用于出。注意,在为空时,需要对应处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值