线性表操作
时间限制(普通/Java)
:
1000 MS/ 3000 MS 运行内存限制 : 65536 KByte
总提交 : 3488 测试通过 : 760
转载请指明出处:
http://blog.csdn.net/fxdaniel/article/details/43272483
总提交 : 3488 测试通过 : 760
题目描述
线性表是n个元素的有序集合(n≥0),n是线性表中元素的个数,称为线性表的长度。可以用一组地址连续的存储单元依次存储线性表中元素,采用这种存储方式的线性表称为顺序表。
请在顺序表上实现运算,实现顺序表的逆置,删除表中所有元素值等于x的元素。
输入
三组数据,顺序表元素类型分别为整型、字符型和实型。
每一组第一行给出元素数目n(0<n≤1000),第二行给出元素数值,第三行给出待删除的元素。
输出
三组数据,每一组第一行给出逆置后的顺序表元素,第二行是在此基础上删除指定元素后的顺序表元素,每一个输出元素后均有一个空格,如果元素全部被删除,那么输出一个空行。
样例输入
8
1 2 3 7 5 6 7 8
7
3
a c m
h
4
1.2 3.4 5.6 7.8
1.2
样例输出
8 7 6 5 7 3 2 1
8 6 5 3 2 1
m c a
m c a
7.8 5.6 3.4 1.2
7.8 5.6 3.4
提示
该题属于南京邮电大学《数据结构A》实验一中的内容,验证的是课本代码,请慎重解答。
2014.12.30 输出格式做了必要说明。
题目来源
南京邮电大学《数据结构A》课程实验
我的答案(JAVA):
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Main {
static class SeqList<T>{
private List<T> list=new ArrayList<T>();
private T value;
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
public void add(T o){
list.add(o);
}
public SeqList<T> remove(T o){
List<T> tempList=new ArrayList<T>();
for(T t:list){
if(t.equals(o)){
tempList.add(o);
}
}
list.removeAll(tempList);
return this;
}
public SeqList<T> reverse(){
Collections.reverse(list);
return this;
}
public void print(){
for(T o:list){
System.out.print(o+" ");
}
System.out.print("\n");
}
}
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
int i,len;
// 录入第一组数据
SeqList<Integer> list1=new SeqList<Integer>();
len=cin.nextInt();
if (len <= 0 || len > 1000) {
System.out.println("out of bounds");;
}
for(i=0;i<len;i++){
list1.add(cin.nextInt());
}
list1.setValue(cin.nextInt());
// 录入第二组数据
SeqList<Character> list2 = new SeqList<Character>();
len=cin.nextInt();
if (len <= 0 || len > 1000) {
System.out.println("out of bounds");;
}
for (i = 0; i < len; i++) {
list2.add(cin.next().charAt(0));
}
list2.setValue(cin.next().charAt(0));
// 录入第三组数据
SeqList<Float> list3= new SeqList<Float>();
len=cin.nextInt();
if (len <= 0 || len > 1000) {
System.out.println("out of bounds");;
}
for (i = 0; i < len; i++) {
list3.add(cin.nextFloat());
}
list3.setValue(cin.nextFloat());
// 处理第一粗数据
list1.reverse().print();
list1.remove(list1.getValue()).print();
// 处理第二粗数据
list2.reverse().print();
list2.remove(list2.getValue()).print();
// 处理第三粗数据
list3.reverse().print();
list3.remove(list3.getValue()).print();
cin.close();
}
}
第二种写法,没有本质差别,同样报
Memory Limit Exceed
错误(郁闷~)
import java.lang.reflect.Array;
import java.util.Scanner;
public class Main {
static class SeqList<T>{
private T[] arr;
private int maxLen;
private int n;
public int getMaxLen() {
return maxLen;
}
public void setMaxLen(int maxLen) {
this.maxLen = maxLen;
}
public SeqList(Class<T> type,int len) {
arr=(T[])Array.newInstance(type, len);
maxLen=len;
n=0;
}
public void add(T o){
if(n>maxLen){
System.out.println("out of bounds");
}
arr[n]=o;
n++;
}
public void remove(T o){
for(int i=0;i<n;i++){
if(arr[i].equals(o)){
for(int j=i;j<maxLen-1;j++){
arr[j]=arr[j+1];
}
i--;
n--;
}
}
}
public void print(){
for(int i=n-1;i>=0;i--){
System.out.print(arr[i]+" ");
}
System.out.print("\n");
}
}
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
int i;
// 录入第一组数据
SeqList<Integer> list1=new SeqList<Integer>(Integer.class,cin.nextInt());
for(i=0;i<list1.getMaxLen();i++){
list1.add(cin.nextInt());
}
int value1=cin.nextInt();
// 录入第二组数据
SeqList<Character> list2=new SeqList<Character>(Character.class,cin.nextInt());
for(i=0;i<list2.getMaxLen();i++){
list2.add(cin.next().charAt(0));
}
char value2=cin.next().charAt(0);
// 录入第三组数据
SeqList<Float> list3=new SeqList<Float>(Float.class,cin.nextInt());
for(i=0;i<list3.getMaxLen();i++){
list3.add(cin.nextFloat());
}
float value3=cin.nextFloat();
list1.print();
list1.remove(value1);
list1.print();
list2.print();
list2.remove(value2);
list2.print();
list3.print();
list3.remove(value3);
list3.print();
cin.close();
}
}