Лабораторная работа 49

Стеки и очереди

 

Цель работы: изучить создание и работу с очередями и стеками, научиться решать задачи с использованием очередей и стеков на языке C++.

 

Теоретические сведения

Очередь и стек – это частные случаи однонаправленного списка.

Стеки

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

Стек (англ. stack – стопка) – структура данных с методом доступа к элементам LIFO (Last In – First Out, «последним пришел – первым вышел»). Чаще всего принцип работы стека сравнивают со стопкой тарелок: чтобы взять вторую сверху, нужно взять верхнюю.

Стек – это список, у которого доступен один элемент (одна позиция). Этот элемент называется вершиной стека. Взять элемент можно только из вершины стека, добавить элемент можно только в вершину стека. Например, если записаны в стек числа 1, 2, 3, то при последующем извлечении получим 3,2,1.

 


Рис. Стек

 

Описание стека выглядит следующим образом:

struct имя_типа {

информационное поле;

адресное поле;

};

где информационное поле – это поле любого ранее объявленного или стандартного типа;

адресное поле – это указатель на объект того же типа, что и определяемая структура, в него записывается адрес следующего элемента стека.

 

Например:

struct list {

type pole1;

list *pole2 ;

} stack;

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

· доступ к вершине;

· добавление элемента в вершину;

· удаление элемента из вершины.

 

Пример 1. Рассмотрим задачу. Пусть требуется ввести некоторую последовательность символов, заканчивающуюся точкой, и напечатать ее в обратном порядке. Представленная ниже программа сначала вводит все символы последовательности, записывая их в стек, а затем содержимое стека печатается в обратном порядке. Реализация стека выполнена в связанном хранении при помощи указателей p и q на тип, именованный как STACK.

#include <stdio.h>

#include <stdlib.h>

 

typedef struct st {// объявление типа STACK

char ch;//информационное поле

struct st *ps;

//указатель на структуру типа st

} STACK;

 

void main() {

STACK *p,*q;

char a;

p=NULL;

do {// заполнение стека

scanf("%c",&a);

q=(STACK*)malloc(sizeof(STACK));

q->ps=p; p=q; q->ch=a;

}

while(a!='.');

do {// печать стека

p=q->ps;

free(q);q=p;

printf("%c",p->ch);

}

while(p->ps!=NULL);

}

 

 

Пример 2. Дана строка символов. Проверьте правильность расстановки в ней круглых скобок.

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

 

//объявление структуры стека

struct node {

struct node *next;

char ch;

};

 

//Объявление вершины стека

struct node *VER=NULL;

struct node *steak;

 

void AddToSteak(char ch) { //Добавление элемента в стек

steak =(node*)malloc(sizeof(node));

steak->next=VER;

steak->ch=ch;

VER=steak;

}

 

int DelNode() {//Удаление элемента из стека

if(VER==NULL) return 0;

VER=steak->next;

free(steak);

steak=VER;

return 1;

}

 

void DestroySteak() {//Удалить весь стек

printf("Error!");

while(steak!=NULL) {

VER=steak->next;

free(steak);

steak=VER;

}

}

 

void main() {

char text[255];

int i;

int flag=1;

//идентификатор при удалении верхнего элемента стека

printf("Input line of text with \"(\" and \")\" ->");

gets(text);

for(i=0;i<strlen(text); i++) {

if(text[i]==')' ) {

if(steak==NULL) {

//Попытка удалить нулевой элемент стека

flag=0;;

break;

}

if(steak->ch=='(') {

flag=DelNode();

if(flag==0) {//Попытка удалить нулевой элемент стека

break;

}

}

}

if(text[i]=='(')AddToSteak(text[i]);

}

if(flag!=0 && steak==NULL) printf("All right!");

else DestroySteak();

printf("\n");

}

 








Дата добавления: 2015-02-16; просмотров: 734;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.009 сек.