2K_programuvanna / 3 mod / lab_14
.docЛабораторная работа №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; // указатель на следующий элемент очереди
} QUOTE;
void add(QUOTE **head, QUOTE **tail, int item); // поместить item в очередь
int shift(QUOTE **head, QUOTE **tail);
int main(){
QUOTE *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(QUOTE **tail, QUOTE **head, int item){ // поместить item в очередь
// создаем эллемент
QUOTE *new_item;
new_item = (QUOTE*)malloc(sizeof(QUOTE)); //выделяем память под новый элемент
new_item -> info = item; // присваиваем значение новому элементу
new_item -> prev = NULL;
// устанавливем связи
(**tail).prev = new_item; // присоединяем новый элемент
*tail = new_item;
if (*head==NULL){
*head = new_item;
}
}
int shift(QUOTE **tail, QUOTE **head){
QUOTE * element = *head;
int value = element->info;
*head = (**head).prev;
free(element);
if (*head==NULL){
*tail = NULL;
}
return value;
}
Задания
Задание 1. Стеки
-
Ввести с клавиатуры 10 чисел. Сформировать из них 2 новых стека, поместив в первый все четные элементы, а во второй — все нечетные. Выведите стеки на экран.
-
Даны два непустых стека одинаковой длинны. Создайте новый стек, элементы которого равны сумме соответствующих элементов первого и второго стеков.
-
Реализуйте проверку баланса скобочек вида '{','[','}',']' в арифметическом выражении.
-
Ввести с клавиатуры 12 чисел, поместив в первый положительные элементы, а во второй — отрицательные. Выведите стеки на экран.
-
Ввести с клавиатуры 14 чисел. Сформируйте из них стек. Уделите из стека все числа, до первого отрицательного.
-
Реализуйте проверку баланса скобочек вида '(','[',')',']' в арифметическом выражении.
-
Ввести с клавиатуры 12 чисел. Сформируйте из них стек. Вычислите среднее арифметически элементов стека.
-
Ввести с клавиатуры 15 чисел. Сформируйте из них стек S1. Сформируйте новый стек и стека S1, в котором все отрицательные элементы заменены 0.
-
Ввести с клавиатуры 15 символов. Сформируйте из них стек. Подсчитайте, сколько раз в стек входит символ 'A'.
-
Даны два стека S1 и S2. Реализуйте функцию присоединения стека S1 к стеку S2
Задание 2. Очереди.
-
Сформировать две непустые очереди одинаковой дины. Сформируйте новую очередь, элементы которой равны сумме соответствующих элементов первой и второй очереди.
-
Даны две очереди, в которых числа записаны в порядке возрастания. Соедините две очереди, так, чтобы элементы в ней тоже были упорядочены по возрастанию.
-
Заполните очередь числами введенными с клавиатуры. Предусмотрите условно-бесконечный (ограниченный размером динамической памяти ) размер очереди и возможность прекращения ввода чисел по нажатию Esc. Найти максимальный элемент очереди и его номер.
-
Заполните очередь числами введенными с клавиатуры. Предусмотрите условно-бесконечный (ограниченный размером динамической памяти ) размер очереди и возможность прекращения ввода чисел по нажатию Esc. Найдите сумму элементов очереди.
-
Дана очередь заполненная числами. Сформировать из нее 2 очереди, в первой из них содержатся числа с четными номерами, а во второй — с нечетными.
-
Дана очередь заполненная числами. Сформировать из нее 2 очереди, в первой из них содержатся четные числа, а во второй — нечетные.
-
Даны две непустые очереди. Сформировать из них третью очередь, в которой элементы первой и второй очереди чередуются.
-
Заполните очередь 10 числами введенными с клавиатуры. Определите максимальный элемент очереди и его номер.
-
Проверить, является ли введенная строка палиндромом. Пример палиндромов: “404”, “11-11-11”, “Дом мод”.
-
Даны де очереди. Реализуйте функцию, которая присоединяет вторую очередь к первой.