МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра ЕОМ
Лабораторна робота № 3
Структура даних СТЕК
1 Мета роботи:
Вивчення фундаментальної абстрактної структури даних стек. Набуття практичних навичок побудови стека, дослідження динаміки його вмісту та використання стеків для розв'язання прикладних задач.
2 Постановка задачі:
Написати програму для послiдовного зберiгання трьох стекiв в масивi з N елементiв (стеки розміщуються в масиві рівномірно один за одним). На вході задаються пари цiлих чисел (i,j), де 1 ( і ( 3 , j ( 0. Число j>0 пари (i,j) додається в i-ий стек; число j<0 пари (i,j) не використовується, але один елемент вилучається зі стеку. Після обробки всієї заданої вхідної послідовності знайти в якому стеку сума всіх парних чисел буде найменьшою.
3 Алгоритм роз’вязку задачі:
Спочатку по черзі вносимо в масив з N елементів 3 стеки. На вході задаю пари цiлих чисел (i,j), де 1 ( і ( 3 , j ( 0. Число j>0 пари (i,j) додаю в i-ий стек; число j<0 пари (i,j) не використовується, але один елемент вилучаю зі стеку. Після обробки всієї заданої вхідної послідовності знахожу в якому стеку сума всіх парних чисел буде найменьшою.
4 Динаміка вмісту стеку:
5 Результати виконання програми:
Висновки:
На цій лабораторній роботі я ознайомився з cтруктурою даних стек. Дослідив принципи і методи роботи зі стеком.
Додатки:
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<string>
using namespace std;
#define n 10
int stk[n]={0};
int k=0,l=n/2,m=(n/3)*2;
void push(int b,int a)
{
if (b==1)
{ if (k<n/3) {
stk[k]=a;
k++; } else
printf("\nStack l overload\n");
} else
if (b==2)
{ if (l<(n/3)*2) {
stk[l]=a;
l++; } else
printf("\nStack 2 overload\n");
} else
if (b==3)
{ if (m<n) {
stk[m]=a;
m++; } else
printf("\nStack 3 overload\n");
}
}
void pop(int b)
{
if (b==1)
{
if (k>0)
k--; else
printf("\nStack 1 underflow\n");
} else
if (b==2)
{
if (l>(n/3))
l--; else
printf("\nStack 2 underflow\n");
} else
if (b==3)
{
if (m>(n/3)*2)
m--; else
printf("\nStack 3 underflow\n");
}
}
int top(int b)
{
if (b==1)
return stk[k-1]; else
if (b==2)
return stk[l-1]; else
if (b==3)
return stk[m-1];
}
bool empty(int b)
{
if (b==1)
{
return (!(bool)k);
} else
if (b==2)
{
return (!(bool)(l>((10/3))));
} else
if (b==3)
{
return (!((bool)(m>(n/3)*2)));
}
}
bool full(int b)
{
return !empty(b);
}
void print()
{
for(int i=0;i<n;i++)
printf("%d ",stk[i]);
printf("\nk=%d l=%d m=%d\n",k,l,m);
}
void main()
{
int g[2][7]={{1,3,2,1,2,3,2},{2,8,3,6,8,7,1}};
for (int i=0;i<7;i++) {
if (g[1][i]>0)
push(g[0][i],g[1][i]); else
pop(g[0][i]);
print();}
int sum1=0,sum2=0,sum3=0;
while (!(empty(1))){
if (top(1)%2==0)
sum1+=top(1); pop(1);}
while (!(empty(2))){
if (top(2)%2==0)
sum2+=top(2); pop(2);}
while (!(empty(3))){
if (top(3)%2==0)
sum3+=top(3); pop(3);}
if (sum1>sum2 && sum1>sum3)
printf("\nmax1=%d",sum1); else
if (sum2>sum1 && sum2>sum3)
printf("\nmax2=%d",sum2); else
printf("\nmax3=%d",sum3);
getch();
}