2017-02-13 2 views
-2

Я унаследовал таблицы классов из класса Java Stack. У меня есть переопределенные методы push и pop этого класса. Так или иначе, при каждом нажатии ничего не добавляется в стеки, показывающие размер() всегда ноль. Пожалуйста, посоветуйте мне все, что могло пойти не так. Прикрепление код:Пользовательский класс стека в java, унаследованный от Stack, всегда остается пустым

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.Stack; 


class Tables extends Stack<Integer>{ 
boolean full; 
int tabCount; 
int cleanCount; 
Stack<Integer> stack; 
public Tables(int n){ 
    tabCount = n; 
    stack = new Stack<Integer>(); 
    full = false; 
    cleanCount = 0; 
} 
@Override 
public synchronized Integer pop() { 
    full = false; 
    return super.pop(); 
} 
@Override 
public Integer push(Integer item) { 
    System.out.println(" PushStats : "+stack.size()+" "+tabCount +" " + stack.isEmpty()); 
    if(stack.size() == tabCount-1) 
    { 
     full = true; 
    } 
    cleanCount ++; 
    return super.push(item); 
} 
} 

public class Main1{ 

    public static void main(String[] args) throws NumberFormatException, IOException{ 
    int n,m,t; 
    BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in)); 

    t = Integer.parseInt(bReader.readLine());//Test Cases 
    for(int test = 0 ; test <t ; test++){ 
     String holder = bReader.readLine(); 
     String[] temp = holder.trim().split(" "); 
     n = Integer.parseInt(temp[0]);//Tables 
     m = Integer.parseInt(temp[1]);//Orders 
     holder = bReader.readLine(); 
     temp = holder.trim().split(" "); 
     Integer[] orders = new Integer[m]; 
     for(int i =0; i<m ; i++){ 
      orders[i] = Integer.parseInt(temp[i]); 
     } 
     process(n,m,orders); 
    } 
} 


private static void process(int n, int m, Integer[] orders) { 
    Tables tables = new Tables(n); 
    for(Integer order : orders){ 
     System.out.println(" Order from :"+order+". Stack status :full = "+tables.full); 

     if(tables.search(order) == -1){ 
      if(tables.full){ 
       System.out.println("Popped out: "+tables.pop()); 
      } 
      tables.push(order); 
     } 
     } 
     System.out.println("Result : "+ tables.cleanCount); 
    } 
} 
+1

какой-то код пожалуйста .... –

+0

Вы переопределили методы 'push' и' pop', поэтому вам нужно опубликовать их, если вы хотите, чтобы мы могли рассказать вам, что не так. – BackSlash

+1

Я уверен, что вы забыли называть 'super.push (T)' и 'super.pop()' в методах переопределения. – matoni

ответ

3

Вы продлили Stack, таким образом, наследуя все его функциональные возможности, имея некоторый доступ к внутренним полям и т.д. Тем не менее, вы можете также создать Stack экземпляр в конструкторе и сохранить его в качестве поля. Некоторые из ваших методов делегируют этот экземпляр, тогда как другие вызовы методы на super.

Удалите строку Stack<Integer> stack; и сделайте каждую строку, ссылающуюся на нее, наследуемыми полями, методами или супер-вызовом.

Вы путаете здесь два подхода: делегирование против наследования. Ваш класс : a Stack, поэтому он не обязательно должен провести другой стек.

+0

Глупая ошибка, которую я сделал. Да, слились два разных подхода. Огромное спасибо. – pyroCoder

+0

@CKing Это сложная ситуация. Я предпочитаю только комментарий, так как люди, не знакомые с сайтом, не всегда полностью осознают правильный способ делать что-то. Непосредственные downvotes или закрытие могут отпугнуть их, в то время как с некоторой позитивной поддержкой они могут оказаться ценными членами сообщества. У SO есть что-то вроде кривой обучения, и я помню, что было больше терпения и гораздо меньше закрытия. Конечно, некоторые вопросы явно не поддаются экономии. Это просто нужно было редактировать, чтобы включить код, а затем немного чтения. –

Смежные вопросы