Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
30
Добавлен:
19.04.2015
Размер:
39.94 Кб
Скачать

Лабораторная работа №14

Реализация алгоритмов с использованием стеков и очередей.

Цель работы: Овладеть навыками работы с линейными связанными структурами. Получить представление о принципах работы с стеками и очередями.

Стек

Стек — линейная связанная структура данных, на которой определены следующие операции:

  • вставить элемент в вершину стека (push);

  • снять элемент с вершины стека (pop);

Пример

Задание: поместите 10 чисел в стек, выведите их на экран.

#include <stdlib.h>

#include <stdio.h>

typedef struct st {

int info;

struct st *prev;

} STACK;

void push(STACK **s, int item); // поместить item в стек *s

int pop(STACK **s); // достать эллемент из стека

int peek(STACK *s); // посмотреть на верхний элемент

int main(){

STACK *head = NULL;

int i,value;

for (i = 0; i< 10; i++){

printf("Vvedite element %d:", i);

scanf("%d",&value);

push(&head,value);

}

while (head)

printf("%d ", pop(&head));

return 0;

}

void push(STACK **s, int item){

STACK *new_item;

new_item = (STACK*)malloc( sizeof (STACK) ); //выделяем память под новый элемент стека

new_item -> info = item; // присваиваем значение новому элементу стека

new_item -> prev = *s; // присоединяем новый элемент на вершину стека

*s = new_item; // изменяем значение указателя на вершину стека

}

int pop(STACK **s){

STACK * remove_it = *s;

int value = peek(remove_it);

*s = (**s).prev;

free(remove_it);

return value;

}

int peek(STACK *s){

return s->info;

}

Очередь

Очередь — линейная связанная структура данных, на которой определены следующие операции:

  • вставить элемент в хвост очереди (add);

  • снять элемент с начала очереди (shift);

Пример

Задание: поместите 10 чисел в стек, выведите их на экран.

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

typedef struct st { // элемент очереди

int info; // элемент хранения очереди

struct st *prev; // указатель на следующий элемент очереди

} QUEUE;

void add(QUEUE **head, QUEUE **tail, int item); // поместить item в очередь

int shift(QUEUE **head, QUEUE **tail);

int main(){

QUEUE *head = NULL, *tail = NULL;

int i,value;

clrscr();

for (i = 0; i< 10; i++){

printf("Vvedite element %d:", i);

scanf("%d",&value);

add(&tail,&head,value);

}

while (head){

printf("%d ",shift(&tail,&head));

}

return 0;

}

void add(QUEUE **tail, QUEUE **head, int item){ // поместить item в очередь

// создаем эллемент

QUEUE *new_item;

new_item = (QUEUE*)malloc(sizeof(QUEUE)); //выделяем память под новый элемент

new_item -> info = item; // присваиваем значение новому элементу

new_item -> prev = NULL;

// устанавливем связи

(**tail).prev = new_item; // присоединяем новый элемент

*tail = new_item;

if (*head==NULL){

*head = new_item;

}

}

int shift(QUEUE **tail, QUEUE **head){

QUEUE * element = *head;

int value = element->info;

*head = (**head).prev;

free(element);

if (*head==NULL){

*tail = NULL;

}

return value;

}

Задания

Задание 1. Стеки

  1. Ввести с клавиатуры 10 чисел. Сформировать из них 2 новых стека, поместив в первый все четные элементы, а во второй — все нечетные. Выведите стеки на экран.

  2. Даны два непустых стека одинаковой длинны. Создайте новый стек, элементы которого равны сумме соответствующих элементов первого и второго стеков.

  3. Реализуйте проверку баланса скобочек вида '{','[','}',']' в арифметическом выражении.

  4. Ввести с клавиатуры 12 чисел, поместив в первый положительные элементы, а во второй — отрицательные. Выведите стеки на экран.

  5. Ввести с клавиатуры 14 чисел. Сформируйте из них стек. Уделите из стека все числа, до первого отрицательного.

  6. Реализуйте проверку баланса скобочек вида '(','[',')',']' в арифметическом выражении.

  7. Ввести с клавиатуры 12 чисел. Сформируйте из них стек. Вычислите среднее арифметически элементов стека.

  8. Ввести с клавиатуры 15 чисел. Сформируйте из них стек S1. Сформируйте новый стек и стека S1, в котором все отрицательные элементы заменены 0.

  9. Ввести с клавиатуры 15 символов. Сформируйте из них стек. Подсчитайте, сколько раз в стек входит символ 'A'.

  10. Даны два стека S1 и S2. Реализуйте функцию присоединения стека S1 к стеку S2

Задание 2. Очереди.

  1. Сформировать две непустые очереди одинаковой дины. Сформируйте новую очередь, элементы которой равны сумме соответствующих элементов первой и второй очереди.

  2. Даны две очереди, в которых числа записаны в порядке возрастания. Соедините две очереди, так, чтобы элементы в ней тоже были упорядочены по возрастанию.

  3. Заполните очередь числами введенными с клавиатуры. Предусмотрите условно-бесконечный (ограниченный размером динамической памяти ) размер очереди и возможность прекращения ввода чисел по нажатию Esc. Найти максимальный элемент очереди и его номер.

  4. Заполните очередь числами введенными с клавиатуры. Предусмотрите условно-бесконечный (ограниченный размером динамической памяти ) размер очереди и возможность прекращения ввода чисел по нажатию Esc. Найдите сумму элементов очереди.

  5. Дана очередь заполненная числами. Сформировать из нее 2 очереди, в первой из них содержатся числа с четными номерами, а во второй — с нечетными.

  6. Дана очередь заполненная числами. Сформировать из нее 2 очереди, в первой из них содержатся четные числа, а во второй — нечетные.

  7. Даны две непустые очереди. Сформировать из них третью очередь, в которой элементы первой и второй очереди чередуются.

  8. Заполните очередь 10 числами введенными с клавиатуры. Определите максимальный элемент очереди и его номер.

  9. Проверить, является ли введенная строка палиндромом. Пример палиндромов: “404”, “11-11-11”, “Дом мод”.

  10. Даны де очереди. Реализуйте функцию, которая присоединяет вторую очередь к первой.

Соседние файлы в папке mod3