一、数据结构和算法概述
算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略 机制。
数据结构就是把数据组织起来,为了更方便地使用数据我们为了解决问题,需要将数据保存下来,然后根据数据的存储方式来设计算法实现进行处理,那么数据的存储方式不同就会导致需要不同的算法进行处理。
程序 = 数据结构 + 算法
线性结构和非线性结构
线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系
线性结构有两种不同的存储结构,即顺序存储结构(数组)和链式存储结构(链表)。顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的。
链式存储的线性表称为链表,链表中的存储元素不一定是连续的
线性结构常见的有:数组、队列、链表和栈
非线性结构
二维数组,多维数组,广义表,树结构,图结构。
二、栈
栈是限制插入和删除只能在一个位置上进行的线性表
栈顶允许插入和删除的一端位于表的末端,不允许插入和删除的一端为栈底。操作有push(压栈)和pop(出栈)
使用数组来模拟栈的使用
public class ArrayStack {
/**
栈的大小
*/
private int maxStack;
/**
数组用来模拟栈
*/
private int[] stack;
/**
* 表示栈顶,默认值为-1
*/
private int top = -1;
/**
*
* @param maxStack 初始化栈的大小
*/
public ArrayStack(int maxStack){
this.maxStack = maxStack;
this.stack = new int[this.maxStack];
}
/**
* 判断是否已经栈满
* @return
*/
public boolean isFull(){
return this.top==maxStack-1;
}
/**
* 是否空栈
*/
public boolean isEmpty(){
return this.top==-1;
}
/**
* 入栈
*/
public void push(int value){
if (isFull()){
throw new RuntimeException("栈已满...");
}
top++;
stack[top] = value;
}
/**
*出栈
*/
public int pop(){
if (isEmpty()){
throw new RuntimeException("空栈,没有数据");
}
int value = stack[top];
top--;
return value;
}
/**
* 查看栈中数据
*/
public void list(){
if (isEmpty()){
throw new RuntimeException("空栈,没有数据");
}
for (int i=0;i<stack.length;i++){
System.out.printf("stack[%d]=%d\n",i,stack[i]);
}
}
//栈中元素存在的个数
public int length(){
return this.top+1;
}
}
回文数据,使用栈可以轻松判断字符串是否是回文数据
public static boolean detection(String words){
//初始化栈对象
ArrayStack arrayStack = new ArrayStack(10);
//获取字符串长度
int length = words.length();
//拿去字符串中的每个字符,压栈至数组中
for (int i=0;i<length;i++){
arrayStack.push(words.charAt(i));
}
String newValue = "";
//随着每次pop,length的长度是会改变的,所以要把length的值固定
//for (int i=0;i<arrayStack.length();i++)
int length1=arrayStack.length()
//for (int i=0;i<length1;i++)
{
//判断是否是空栈
if (!arrayStack.isEmpty())
{
char value =(char) arrayStack.pop();
//拼接
newValue = newValue+value;
}
}
//弹栈出来的数据和压栈出去的数据比较
if (words.equals(newValue)){
return true;
}
return false;
}