数据结构之队列,栈,链表

一、队列

什么是队列?

队列是一种特殊的线性结构,也是一种表,使用队列时插入在一端而删除在另一端进行。

队列在生活中的场景很多,比如火车队买票,每个排队的窗口就是一个队列,先来的人站在前面,先买到票,后来的人排在后面,队列是先进先出(FIFO)原则。

队列的基本模型:

入队:在表的末端插入一个元素

出队:删除(并返回)在表的开头的元素

问题:给定一列数,使用队列输出。

import java.util.Scanner;

public class Duilie {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();  //读入个数n
		int[] q = new int[n+1]; //创建数组实现队列
		int head = 0, tail = 0;  //定义队首和队尾,初始队列为空时,队首和队尾指向第一个下标
	    while(tail < n){
	    	q[tail] = sc.nextInt();
	    	tail++; //每读进一个数,队尾往后移一位
	    }
		while(head < tail){  //打印队列
			System.out.print(q[head]+" ");
			head++;
		}
		sc.close();
	}
}

二、栈

什么是栈呢?

栈是限制插入和删除只能在同一位置上进行的表,该位置是表的末端(栈也是一种表),叫做栈顶,对栈的基本操作有进栈和出栈。前者是相当于插入,后者是删除最后插入的元素。栈是后进先出的数据结构,举个例子,薯片,你最先抽出的是最后放进去的一片,如果你想吃到最里面那片,那么你只能先把外面的全部吃完。

问题:

使用栈实现判断回文串。

import java.util.Scanner;

public class ZhanShixianHuiwenshu {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int len,mid,next,top;
		String str = sc.nextLine();//读入子浮串
		char[] c = str.toCharArray(); //将字符串转换为数组
		len = c.length;
		char[] s = new char[len+1];
		mid = len/2-1; //取中电
		top = 0;
		for(int i=0; i<=mid; i++){ //将mid前的字符重新依次入栈
			s[++top] = c[i];
			
		}
		if(len%2==0) //判断字符串的长度是奇数或者偶数,
			next=mid+1;//找到需要匹配字符串的起始下标
		else 
			next=mid+2;
		for(int i=next;i<=len-1; i++){//开始匹配
			if(c[i] != s[top]){
				break;
			}
			top--;
		}
		if(top==0)
			System.out.println("YES");
		else
			System.out.println("No");
		sc.close();
	}
	  
}

三、链表

使用数组存储数字比较方便,但是对于一些增删操作会比较麻烦,比如如果你向已经排好序的数组中插入一个数,那么你需要先把这个数放到数组中,然后将原本该数后面的所有数往后移一位。而使用链表会快很多。

那么,什么是链表呢?

链表由一系列节点组成,这些节点不必在内存中相连,每一个节点均含有表元素和到包含该元素后继几点的链(link),我们称之为next链,最后一个单元的next链引用null。链表有单项链表和双向链表(这里不细说,给出单项链表是数组实现)

C语言中可以使用指针实现链表,下面给出利用数组模拟实现链表。

import java.util.Scanner;

public class LianBiao {
	
public static void main(String[] args) {
	int data[] = new int[12]; //存储数据的数组
	int right[] = new int[12]; //存的是每个data[i]右边位置的下标
	int n,len,t;
	Scanner sc = new Scanner(System.in);
	n = sc.nextInt();//个数n
	for(int i=1;i <= n; i++){//将n个数读入到数组data中
		data[i] = sc.nextInt();
	}
	len = n;
	for(int i=1; i<= n; i++){//数组的初始化,前n-1个数的右边位置下标等于数组下标加一
		if(i!=n){             //标等于数组下标加一
			right[i] = i+1;
		}
		else{              //最后一个数的右边没人了,存储为0
			right[i] =0;
		}
	}
	len++;
	data[len]=sc.nextInt();//将要插入的数读到data数组的最后一位
	t=1;
	while(t!=0){
		if(data[right[t]]>data[len]){//判断这个数应该在哪个位置,本列中假设这组数是
			right[len] = right[t];  //由小到达排,即当某一个数的右边数比待插入数大时
			right[t] =len;     //把待插入数放在这个数的左边,更新坐标
			break;             
		}
		t = right[t];//更新t,从左往右遍历数组
	}
	t=1;
	while(t!=0){
		System.out.print(data[t]+" ");
		t = right[t];
	}
	sc.close();
}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值