русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Представление стека в виде вектора


Дата добавления: 2014-02-04; просмотров: 1403; Нарушение авторских прав


Стеки

Лекция 19. Стеки

Способы использования стеганографии

Особенности скрытой передачи аудиоинформации

Среди всех известных пси­хоакустических эффектов наиболее предпочтительным для передачи информации являет­ся эффект маскировки. Более интенсивные речевые отрезки делают неслышимыми сигналы, появившиеся до них («маскировка впе­ред») и после них («маскировка назад»). Временной диапазон маскировки вперед про­стирается до 20 мс, а назад — до 150 мс. Кроме того, существует и частотная маскиров­ка, когда в момент появления более интенсивного низкочастотного сигнала становится неслышным более высокочастотный сигнал меньшей амплитуды.

Помимо безобидного применения стеганографии для сокрытия личных сообщений, существуют и более опасные цели. По мнению специалистов, используя столь «нехитрую технику», террористы ис­пользовали стеганографию для координации своих атак на Нью-Йорк и Вашингтон. Зачастую тайные послания террористов «прятались» в «спаме».

Правительство США очень обеспокоено использованием террористами стегано­графии и учредило проведение исследований по разработке контрмер. Так, WetStone Technologies в Корнинге, Нью-Йорке разрабатывает алгоритм распознавания сообще­ний, внедренных в цифровые послания. Другой, более примитивный способ обнару­жения стеганографических посланий — просматривать Internet-изображения, которые могли затрагивать интересы террористов, такие как фотографии Белого дома или Нью-Йоркской фондовой биржи.

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



Хотя стеганография и криптография принципиально отличаются по целям, их не стоит рассматривать как альтернативу друг другу Это, скорее всего, две стороны од­ной медали. И не только потому, что по-настоящему эффективно лишь их совместное использование, но и потому, что в их основе лежит общая методическая и инструмен­тальная база.

Стек (stack) - это упорядоченная последовательность элементов, в которой выполняются операции включения и исключения элемента по принципу LIFO (Last-In-First-Out) - "последним пришел - первым ушел", т. е. включение и исключение всегда происходят в одном конце (рис. 19.1). Этот конец называют верхом, противоположный - дном стека. Другие названия стека: магазин (по аналогии с магазином пистолета или автомата), очередь типа LIFO.

 

  S[1]     S[2]   …   S[k]     ¾¾¾® ¬¾¾¾
  Дно       Верх     Включение и исключение элементов

Рис. 19.1. Стек

 

Примеры стека: заднее сиденье легкового автомобиля, когда посадка и высадка происходит с одной стороны; стопка подносов в столовой, где подносы берутся и кладутся только сверху.

Назовем некоторые из многочисленных применений стека.

1. Переупорядочивание данных для обработки в порядке, отличающемся от порядка поступления.

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

3. Области локальных данных (включая параметры и адреса возврата) вложенных вызовов подпрограмм.

4. Области локальных данных вложенных блоков программы.

5. Трансляция скобочных структур: выражений, вложенных ветвлений, циклов, блоков и всей программы.

6. ЭВМ и микрокалькуляторы с безадресной магазинной памятью.

7. Стек в мозге человека (7 ± 2 элемента). Психологи обнаружили, что человек может воспринимать именно такую глубину вложенности, например, придаточных предложений фразы или такое количество рассматриваемых вместе дел, понятий и т. п.

Типовые операции над стеком:

1. Инициализация (создание, подготовка к работе);

2. Вталкивание (включение) элемента - PUSH;

3. Выталкивание (исключение) элемента - POP;

4. Проверка пустоты стека;

5. Проверка переполнения стека;

6. Доступ к вершине (получение / изменение значения последнего поступившего элемента).

Чаще всего стек представляется в виде вектора с указателем (рис. 19.2).

 

Рис. 19.2. Хранение стека в виде вектора

 

Часть вектора занимает стек, часть - свободное пространство. Указателем стека служит индекс последнего из поступивших элементов (либо индекс первой свободной позиции). Указатель стека увеличивается на единицу при вталкивании элемента и уменьшается при выталкивании (или наоборот, если стек расположен в конце вектора).

Два стека удобно хранить в одном векторе, заполняя их навстречу друг другу (рис. 19.3).

 

 

Рис. 19.3. Хранение двух стеков в одном векторе

 

Этот способ позволяет расти любому из двух стеков, пока есть хотя бы одна свободная ячейка. Максимальные размеры каждого стека и их суммы равны длине вектора. Для большего количества стеков подобного метода не существует.

 

Программирование операций на языке С (С++)

1. Описание данных для представления стека вектором

 

#define N 100 /* Максимальная длина стека */

тип-элемента st[N]; /* Отображающий вектор стека */

int ist; /* Указатель стека (индекс последнего элемента) */

 

2. Инициализация (создание) пустого стека:

ist = -1;

 

Как и в очереди, при невозможности выполнения операции действия зависят от решаемой задачи. Обычно пустота стека используется как условие окончания алгоритма, а переполнение означает ошибку.

3. Выталкивание из стека элемента и присваивание его величине X (обозначим эту операцию Стек ==> X; без запоминания элемента: Стек ==>):

тип-элемента X; /* Значение вытолкнутого элемента */

. . .

if (ist >= 0) /* В стеке есть элементы */

{ X = st[ist]; /* Получение значения */

ist--; /* Выталкивание элемента */

}

else . . . /* Стек пуст */

 

4. Вталкивание в стек элемента, равного X (обозначим эту операцию Стек <== X):

тип-элемента X; /* Вталкиваемое значение */

. . .

if (ist < N-1) /* Есть место в стеке */

{ ist++; /* Увеличение стека */

st[ist] = X; /* Запись x в вершину стека */

}

else . . . /* Стек переполнен */

 

Задача. Дано арифметическое выражение длиной до 80 символов, оканчивающееся пробелом. Выражение содержит целые числа без знака и знаки операций +, -, *, /. Вычислить значение выражения.

Например, входной текст: 130+25*3-160/20*6 .

Результат: 157.

 

Метод решения задачи основан на использовании стека операндов, операций и приоритетов. Операции * и / имеют одинаковый приоритет, причем более высокий, чем операции + и - . При просмотре выражения происходит выделение очередного операнда (числа), преобразование его из символьной формы в целочисленную и запись в стек полученного числа, следующей за ним операции и присвоенного ей приоритета. Пока в стеке более одного элемента и приоритет последней операции оказывается не выше приоритета предыдущей операции в стеке, происходит выполнение соответствующих операций над двумя последними операндами стека и удаление ненужных элементов из стека. В конце концов, когда просмотр выражения закончится, первый элемент стека и будет искомым результатом.

На рис. 19.4 показано, как меняется содержимое стека.

 

операнд приор-т

оп-ция

┌───┬────┬───┐ ┌───┬─┬─┐ ┌───┬─┬─┐ ┌───┬─┬─┐ ┌───┬─┬─┐ ┌───┬─┬─┐

│130│ + │ 1 │ │130│+│1│ │205│-│1│ │205│-│1│ │205│-│1│ │157│ │0│

│ 25│ * │ 2 │ │ 75│-│1│ │160│/│2│ │ 8│*│2│ │ 48│ │0│ │ │ │ │

│ 3│ - │ 1 │ │ │ │ │ │ 20│*│2│ │ 6│ │0│ │ │ │ │ │ │ │ │

└───┴────┴───┘ └───┴─┴─┘ └───┴─┴─┘ └───┴─┴─┘ └───┴─┴─┘ └───┴─┴─┘

 

Рис. 19.4. Пример заполнения стека операндов, операций и приоритетов.

 

 

В программе стек реализован в виде трех параллельных массивов.

 

 

Программа:

 

 

#include <stdio.h>

#include <conio.h>

/*──────────────────────────────────*/

/* Функция выделения числа и преобразования его из */

/* символьной формы представления в целочисленную */

/*──────────────────────────────────*/

int Сhislo ( char text [], int *i )

/* Входные данные: */

/* text - символьная строка, */

/* *i - индекс первой цифры числа в строке text. */

/* Выходные данные: */

/* *i - индекс следующего после числа символа. */

/* Функция возвращает целое число */

{ int c=0; /* возвращаемое значение */

while (text[*i]>='0' && text[*i]<='9')

{ c=c*10+(text[*i]-'0');

(*i)++;

}

return c;

}

 

 

/*───────────────────*/

/* Главная функция */

/*───────────────────*/

 

main()

{ char text [80]; /* вх. текст - арифм. выражение */

int i ; /* индекс массива text */

float opd [3]; /* стек операндов */

char opc [3]; /* стек операций */

int pr [3] ; /* стек приоритетов */

int j = -1 ; /* указатель стека */

printf ("\nВведите арифметическое выражение.\n");

gets (text);

i=-1;

do

{ i++;

/* запись числа, операции и ее приоритета в стек */

opd[++j] = Сhislo(text,&i); opc[j] = text[i];

switch (text[i])

{

case '+':

case '-': pr[j]=1; break;

case '*':

case '/': pr[j]=2; break;

case ' ' /* пробел */: pr[j]=0;

}

while (j>0 && pr[j]<=pr[j-1])

{ /* выполнение соответствующей операции */

switch (opc[j-1])

{ case '+' : opd[j-1] = opd[j-1] + opd[j]; break;

case '-' : opd[j-1] = opd[j-1] - opd[j]; break;

case '*' : opd[j-1] = opd[j-1] * opd[j]; break;

case '/' : opd[j-1] = opd[j-1] / opd[j];

}

/* удаление выполненной операции из стека */

opc[j-1]=opc[j]; pr[j-1]=pr[j]; j=j-1;

}

}

while (text[i]!=' ');

printf ("Результат: %.2f\n",opd[0]);

getch();

}

 

 

Результаты тестирования:

 

Введите арифметическое выражение.

9/4-12

Результат: -9.75

 

Введите арифметическое выражение.

10*2/5+6/3

Результат: 6.00

 

Введите арифметическое выражение.

130+25*3-160/20*6

Результат: 157.00

 

Введите арифметическое выражение.

Результат: 2345.00

 

 



<== предыдущая лекция | следующая лекция ==>
Методы компьютерной стеганографии | Конспект лекций


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.307 сек.