20162321王彪 2017-2018《程序设计与数据结构》第五周学习总结

本文主要是介绍20162321王彪 2017-2018《程序设计与数据结构》第五周学习总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

学习目标

  • 掌握Java Collections API的基本结构
  • 理解Collection的抽象设计
  • 掌握Collection实现的Java相关技术:继承/多态/泛型/接口
  • 掌握栈的应用
  • 掌握栈的实现(数组,链式)
  • 分析Java Stack API

知识点总结

  • 集合(collection):线性的和非线性的;线性集合(linear collection)是集合中的元素排成一行。非线性集合是按不同于一行的方式来组织元素,例如按层次或是按网络的方式。
  • 抽象(abstraction)在某些时候隐藏其细节。抽象数据类型(abstract data type,ADT)是其值和操作都没有在程序设计语言中定义的一种数据类型。它是抽象的,因为实现细节必须要定义,而且要对用户隐藏。

代码实现

  • 用数组实现栈
public class ArrayStack<T> {private final int DEFAULT_CAPACITY = 10;private int count;private T[] stack;private T item;public T pop () {if (count==0){System.out.println("Wrong num");}else {item = stack[count-1];stack[count-1]=null;}return item;}public T peek(){if (count==0){System.out.println("Wrong num");}else {item = stack[count-1];}return item;}public boolean isEmpty(){if (count==0)return true;elsereturn false;}public int size(){return count;}public ArrayStack(){count=0;stack =(T[])(new Object[DEFAULT_CAPACITY]);}public void push(T element){if (count==stack.length)expandCapacity();stack[count]=element;count++;}public String toString(){String result = "<top of stack>";for (int index=count-1;index>=0;index--)result += stack[index]+"\n";return result+"<bottom of stack>";}private void expandCapacity(){T[] larger = (T[])(new Object[stack.length*2]);for (int index=0;index<stack.length;index++){larger[index] = stack[index];}stack = larger;}
  • peek()操作要注意当前栈是否是空。

  • 用链表实现栈

public class LinkedStack<T> implements Stack<T>
{private int count;private LinearNode<T> top = new LinearNode<T>(null);//表头,数据为空private LinearNode<T> end = new LinearNode<T>(null);//表尾//----------------------------------------------------------------//  Creates an empty stack using the default capacity.// ----------------------------------------------------------------public LinkedStack() {top.setNext(end);count=0;}
//----------------------------------------------------------------
//  Removes the element at the top of this stack and returns a
//  reference to it. Throws an EmptyCollectionException if the
//  stack contains no elements.
// ----------------------------------------------------------------
public T pop() throws EmptyCollectionException {if (count == 0) throw new EmptyCollectionException ("Pop operation failed. " + "The stack is empty.");T result = top.getNext().getElement();top.setNext(top.getNext().getNext());top.setElement(null);count--;
return result;
}
//----------------------------------------------------------------//   Returns a string representation of this stack.
// ----------------------------------------------------------------public String toString() {String result = "<top of stack>\n";LinearNode current = top;while (current != null) {result += current.getElement() + "\n";current = current.getNext();}return result + "<bottom of stack>";}//----------------------------------------------------------------
//  The following methods are left as programming projects.
// ----------------------------------------------------------------@Overridepublic int hashCode() {return super.hashCode();}@Overridepublic void push(T element) {LinearNode<T> now = new LinearNode<T>(element);//now是用来保存加入元素的节点类的实例now.setNext(top.getNext());//指向top指向的对象top.setNext(now);count++;}@Overridepublic T peek() {return top.getNext().getElement();}@Overridepublic boolean isEmpty() {if (count==0)return true;elsereturn false;}@Overridepublic int size() {return count;}public static void main(String[] args) {LinkedStack mLinked = new LinkedStack();mLinked.push(1);System.out.println(mLinked.isEmpty());}}
//************************************************************
//  LinearNode.java       Java Foundations
// //  Represents a node in a linked list.
// ************************************************************class LinearNode<T> {private LinearNode<T> next;private T element;
//----------------------------------------------------------------
//  Creates an empty node.
// ----------------------------------------------------------------
public LinearNode() {next = null;element = null; }
//----------------------------------------------------------------
//  Creates a node storing the specified element.
// ---------------------------------------------------------------
public LinearNode (T elem) {next = null;element = elem; }
//----------------------------------------------------------------
//  Returns the node that follows this one.
// ----------------------------------------------------------------
public LinearNode<T> getNext() {return next;}
//----------------------------------------------------------------
//  Sets the node that follows this one.
// ----------------------------------------------------------------
public void setNext (LinearNode<T> node) {next = node;}
//----------------------------------------------------------------
//  Returns the element stored in this node.
// ----------------------------------------------------------------
public T getElement() {return element;}
public void setElement (T elem) {element = elem;}}
  • 以上代码是我和刘先润一起写的,所以相同。我们的代码和书上的代码也有一些不同。我们最初定义了两个节点。一个头结点一个尾节点。在构造函数将头节点指向为节点。在操作中头结点和尾节点都不存储数据。(但是后来发现到时没什么作用,到时代码比之书上并不简洁)

  • Android演示Stack

  • 我的思路用RecyclerView来完成此次app.
  • 1.首先要使用RecyclerView就要先添加依赖
    compile 'com.android.support:cardview-v7:21.0.3'compile 'com.android.support:recyclerview-v7:21.0.3'
  • 2.定义一个item
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><TextView xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/title"android:layout_width="match_parent"android:layout_height="130dp"android:gravity="center"android:layout_margin="4dp"android:textColor="#99000000"android:textStyle="bold"android:textSize="22sp"android:background="@color/md_blue_100"android:text="0"/>
</LinearLayout>

1065456-20171015210845730-1954262155.jpg

  • 3.Activity布局
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="wb.is.besti.edu.cd.mystack.MainActivity">
<LinearLayoutandroid:id="@+id/liner"android:layout_width="match_parent"android:layout_height="60dp"android:layout_marginLeft="16dp"android:layout_marginRight="16dp"android:layout_marginBottom="16dp"><EditTextandroid:id="@+id/mtext"android:layout_width="match_parent"android:layout_height="match_parent" />
</LinearLayout><android.support.v7.widget.RecyclerViewandroid:id="@+id/list"android:clipToPadding="false"android:scrollbarStyle="outsideOverlay"android:layout_below="@+id/liner"android:layout_height="match_parent"android:layout_width="wrap_content"></android.support.v7.widget.RecyclerView>
</RelativeLayout>

1065456-20171015210920449-2064986727.jpg

  • 4.menu的布局
<menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/action_push"android:title="PUSH"android:orderInCategory="100"app:showAsAction="always"></item><itemandroid:id="@+id/action_pop"android:title="POP"android:orderInCategory="100"app:showAsAction="always"></item>
</menu>

1065456-20171015210932418-2013617227.jpg

  • 5.Activity
public class MainActivity extends AppCompatActivity {RecyclerView mRecyclerView;SimpleAdapter mAdapter;EditText mText;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mText = (EditText)findViewById(R.id.mtext);mRecyclerView = (RecyclerView)findViewById(R.id.list);mRecyclerView.setLayoutManager(new LinearLayoutManager(this));mRecyclerView.addItemDecoration(new DividerItemDecoration(this,LinearLayoutManager.VERTICAL));mAdapter = new SimpleAdapter(this);mRecyclerView.setItemAnimator(new DefaultItemAnimator());mRecyclerView.setAdapter(mAdapter);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.popandpush,menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {int id = item.getItemId();if (id==R.id.action_push){mAdapter.push(mText.getText().toString());return true;}if (id==R.id.action_pop){mAdapter.remove(SimpleAdapter.LAST_POSITION);return true;}return super.onOptionsItemSelected(item);}
}
  • 6.适配器Adapter
public class SimpleAdapter extends RecyclerView.Adapter<SimpleAdapter.SimpleViewHolder> {public static  int LAST_POSITION = -1;private final Context mContext;private MyStack<String> myStack;public void push(String s){myStack.push(s);LAST_POSITION++;}public void remove(int positon){if (myStack.size()==0){}if (myStack.size()!=0){myStack.pop();notifyItemRemoved(positon);}}public static class SimpleViewHolder extends RecyclerView.ViewHolder{public final TextView title;public SimpleViewHolder(View view){super(view);title = (TextView)view.findViewById(R.id.title);}}public SimpleAdapter(Context context){mContext = context;myStack = new MyStack<>();}@Overridepublic SimpleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {final View view = LayoutInflater.from(mContext).inflate(R.layout.simple_item,parent,false);return new SimpleViewHolder(view);}@Overridepublic int getItemCount() {return myStack.size();}@Overridepublic void onBindViewHolder(SimpleViewHolder holder, int position) {holder.title.setText(myStack.peek());}
}
  • 7.(非必须)添加分割线

  • 效果图
    1065456-20171015210951012-1920508582.png

  • RecyclerView是我在完成假期的工作记录APP时了解到的控件,RecyclerView只管回收与复用View,其他的你可以自己去设置。其高度的解耦,给予你充分的定制自由。进一步的加深使用时添加卫星菜单来实现isEmpty(),peek(),size()等操作及将界面进一步美化。

转载于:https://www.cnblogs.com/wbiao21/p/7673688.html

这篇关于20162321王彪 2017-2018《程序设计与数据结构》第五周学习总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/674623

相关文章

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

C# Task Cancellation使用总结

《C#TaskCancellation使用总结》本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延... 目录C# Task Cancellation总结1、调用cancellationTokenSource.

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig