|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
12.05.2012, 12:04 | #1 |
Пользователь
Регистрация: 20.10.2011
Сообщений: 38
|
Пояснение стека
Используя стек, решить следующую задачу.
В текстовом файле f записана без ошибок формула следующего вида: <формула> ::= <цифра> | М(<формула>, <формула>) | m(<формула>, <формула>) <цифра> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9, где М обозначает функцию max, a m- min. Вычислить как целое число значение данной формулы. Например, М(5,m (6,8))=6. #include <ctype.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <fstream> #include <iostream> // подключили заголовочные файлы используемых библиотек using namespace std; // использование стандартного пространства имен const int maxf=0,minf=1,size=100; // определили константы typedef struct _t{int data[size]; int cur;}st; // объявили тип элемента стека void init(st* s){for(int i=0;i<size;i++)s->data[i]=0; s->cur=-1;} // функция инициализации стека int empty(st *s){return s->cur==-1;} // функция проверки пустоты стека void push(st *s,int i){s->data[++(s->cur)]=i;} // функция заталкивания элемента в стек int pop(st *s){return empty(s)?0:s->data[(s->cur)--];} // функция извлечения элемента из стека int main() { ifstream input_file("f.txt"); // объявили входной поток из файла const int l=100; char e[l]; char buf[l]; st s; init(&s); // объявляем переменные и инициализируем стек input_file.getline(e,l,'\n'); // ввели строку из файла int i,j,len=strlen(e); // определили длину введенной строки for(i=0;i<len;i++){if(e[i]=='M'){push(&s,maxf); continue;} if(e[i]=='m'){push(&s,minf); continue;} if(isdigit(e[i])){j=0; while(isdigit(e[i]))buf[j++]=e[i++]; buf[j]=' '; push(&s,atoi(buf));} // заталкиваем в стек коды операций и числа if(e[i]==')'){int b=pop(&s); int a=pop(&s); int func=pop(&s); if(func==maxf)push(&s,a>b?a:b); else push(&s,a<b?a:b); // если попадается закрывающая скобка, вытаскиваем из стека два числа и код // операции, производим операцию и закидываем результат обратно в стек }} cout<<e<<endl<<pop(&s)<<endl; //выводим строку исходного выражения и результат cin.get(); // задерживает закрытие окна вывода до нажатия Enter } Скажите мне, пожалуйста, что, где и как осуществляется работа со стеком? Как задали/описали стек, что в него последним пришло и первым вышло? Короче, основные ньюансы работы данной программы, по порядочку для особо одаренных...) Буду очень благодарен! |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Пояснение к программе. | user100 | Фриланс | 3 | 18.05.2011 22:52 |
пояснение строк | Katte | Общие вопросы C/C++ | 3 | 02.06.2010 20:18 |
пояснение программы | sllh_111 | Помощь студентам | 0 | 19.02.2010 19:44 |
Пояснение по методу Зейделя. | Tonik_A | Помощь студентам | 0 | 27.12.2009 13:54 |
Помогите дописать пояснение | RECREATOR | Помощь студентам | 4 | 10.12.2007 09:07 |