Я могу Ограничить глубину Универсального Стека?

Вопрос с ответом на себя, на всякий случай он может быть полезен любому:

Это довольно странная ситуация, связанная с драйвером codeigniter mysqli class CI_DB_mysqli_driver в system\database\drivers\mysqli\mysqli_driver.php. По какой-то причине код в

if (isset($this->stricton))         { /* ... */ }

... устанавливает некоторые параметры mysqli MYSQLI_INIT_COMMAND, которые вызывают ошибку.

Легко обойти ошибку , не устанавливая флаг 'stricton' в настройках вашей дБ. Просто закомментируйте это:

$db['default'] = array(
    'dsn'          => '',
    'hostname'     => '127.0.0.1',
    'username'     => 'my_username', 
    'password'     => 'my_password',
    'database'     => 'my_db',
    'dbdriver'     => 'mysqli',
    'dbprefix'     => '',
    'pconnect'     => FALSE,
    'db_debug'     => TRUE,
    'cache_on'     => FALSE,
    'cachedir'     => '',
    'char_set'     => 'utf8',
    'dbcollat'     => 'utf8_general_ci',
    'swap_pre'     => '',
    'encrypt'      => FALSE,
    'compress'     => FALSE,
    // 'stricton'     => FALSE,
    'failover'     => array(),
    'save_queries' => TRUE
);
6
задан FlySwat 21 December 2008 в 04:03
поделиться

4 ответа

То, что Вы ищете, называют стопкой уволенного. AFAIK, BCL не содержит один, хотя они тривиальны для реализации. Обычно функциональность Отмены и Восстановления полагается на такие структуры данных.

Они - в основном массив, и когда Вы продвигаете на стек, 'вершина' стека перемещает массив. В конечном счете вершина перенесется назад к началу, когда стек будет полон, и замените 'нижнюю часть' стека.

Google не обеспечил много информации о нем. Это является лучшим, я мог найти:

(Предупреждение PDF) http://courses.cs.vt.edu/~cs2704/spring04/projects/DropOutStack.pdf

Вот некоторый шаблонный код, для запущения Вас. Я позволю Вам заполнить остальных (проверка исправности, количество, индексатор, и т.д.)

class DropOutStack<T>
{
    private T[] items;
    private int top = 0;
    public DropOutStack(int capacity)
    { 
        items = new T[capacity];
    }

    public void Push(T item)
    {
        items[top] = item;
        top = (top + 1) % items.Length;
    }
    public T Pop()
    {
        top = (items.Length + top - 1) % items.Length;
        return items[top];
    }
}
17
ответ дан 8 December 2019 в 04:56
поделиться

Вы на самом деле смотрите на что-то подобное реализации циклического списка. Существует реализация LimitedQueue, сделанная PIEBALDconsult в CodeProject. Это подобно Вашему требованию. Просто необходимо перенести Стек вместо Очереди, как сделано автором. Плюс автор также реализовал индексатор, который удобен, если необходимо получить доступ к чему-либо еще кроме главного стека (для показа списка отмены, возможно).

Править: Реализация автора также генерирует событие, когда последнее (сначала, зависит от того, является ли это очередью, или стек) удаляется, так, чтобы можно было знать, когда что-то выбрасывается.

3
ответ дан 8 December 2019 в 04:56
поделиться

Я полагаю, что Вы ищете (возможно измененную) двухстороннюю очередь - структура данных, которая предоставляет доступ от любого конца.

1
ответ дан 8 December 2019 в 04:56
поделиться

Я не вижу путь. Можно наследоваться Stack<T>, но, кажется, нет ничего полезного для переопределения.

Легкое (если немного утомительный) путь должно было бы перенестись Stack<T> в Вашем собственном, скажем, LimitedStack<T>. Затем реализуйте методы, которые Вы хотите и передаете до внутреннего Stack<T>, в то время как включая Вашу ограничивающую логику в Push метод и везде, где еще Вам нужен он.

Это - боль, чтобы записать всем тем участникам передачи, особенно если Вы реализуете весь одинаковый интерфейсы как Stack<T>... но с другой стороны, только необходимо сделать это однажды, и затем это сделано.

1
ответ дан 8 December 2019 в 04:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: