Katii
1

Структуры и алгоритмы обработки данных

03.09.2009, 23:12. Показов 2976. Ответов 7
Метки нет (Все метки)

Здравствуйте. Помогите, нужно сделать контрольную, буду ждать сообщении по этой теме. Заранее СПАСИБО!
Вложения
Тип файла: doc кр1алгоритм иструктуры данных5сем.doc (49.5 Кб, 125 просмотров)
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.09.2009, 23:12
Ответы с готовыми решениями:

Н. Вирт - Алгоритмы и структуры данных
Товарищи программисты! Не подскажете, где можно скачать эту книгу в фомтае pdf (именно pdf, не...

Учебник Структуры и алгоритмы обработки данных
Добрый день... Посоветуйте пожалуйста какой нибудь электронный учебник по структурам и аглоритмам...

Структуры и алгоритмы обработки данных. Создать базу данных пользователей Интернет
Создать базу данных пользователей Интернет (имя пользователя, текущий счет, привилегированность...

Структуры и алгоритмы обработки данных Тест SoS
Тест состоит из 48 вопросов , ответить нужно завтра до 3 ,помогите пожалуйста, нашла не все пока...

7
1 / 1 / 1
Регистрация: 29.08.2009
Сообщений: 63
06.09.2009, 07:52 2
ну за контрольные обычно принято платить и сроки оговаривать
0
Эксперт С++
7175 / 3234 / 79
Регистрация: 17.06.2009
Сообщений: 14,164
06.09.2009, 15:08 3
Задание 4. Задача 1.
1. Переведите с помощью стековой памяти инфиксную форму арифметического выражения ((a-b)/(c-d)+f)*e. в постфиксную. Распишите последовательность содержимого стека при решении этой задачи.
Постфиксная запись: a b - c d - / f + e *
Стек сам распиши
0
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
06.09.2009, 15:34 4
Задание 4. Задача 1.
1. Переведите с помощью стековой памяти инфиксную форму арифметического выражения ((a-b)/(c-d)+f)*e. в постфиксную. Распишите последовательность содержимого стека при решении этой задачи.
Когда-то делал такое.

postfix.c
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include <stdio.h>
#include <ctype.h>
#include "eprintf.h"
#define NSTACK 64
#define NRES 128
 
typedef struct Stack Stack;
 
struct Stack {
    int op;      /* оператор */
    int prior;   /* приоритет оператора */
};
 
int sp = 0;
Stack stack[NSTACK];
 
enum {           /* приоритеты */
    BRACK  = 0,  /* скобки   */
    ASSIGN = 0,  /* равно    */
    ADD    = 1,  /* плюс     */
    MINUS  = 1,  /* минус    */
    MULTI  = 2,  /* умножить */
    DIV    = 2   /* делить   */
};
 
/* getprior: вернуть приоритет оператора */
int getprior(int c)
{
    switch(c) {
        case '(':
        case ')': return BRACK;
        case '=': return ASSIGN;
        case '+': return ADD;
        case '-': return MINUS;
        case '*': return MULTI;
        case '/': return DIV;
    }
}
 
/* push: положить элемент в стэк */
void push(int c)
{
    if(sp >= NSTACK)
        eprintf("stack overflow");
    stack[sp].op = c;
    stack[sp].prior = getprior(c);
    sp++;
}
 
/* pop: взять элемент из стэка */
int pop(void)
{
    return (sp > 0) ? stack[--sp].op : EOF;
}
 
/* addtores: добавить элемент к результ. строке */
void addtores(char *s, int c)
{
    char *sstart = s;
 
    while(*s != '\0')
        s++;
    if(s - sstart + 1 >= NRES)
        eprintf("result-string overflow");
    *s++ = c;
    *s = '\0';
}
 
/* checkstack: а не вытолкнуть ли нам оператор из стэка? 0 - нет, 1 - да */
int checkstack(int c)
{
    if(sp == 0)
        return 0;
    if( (c == '+' || c == '-') && (stack[sp-1].prior == ADD || stack[sp-1].prior == MULTI) )
        return 1;
    if( (c == '*' || c == '/') && (stack[sp-1].prior == MULTI) )
        return 1;
    return 0;
}
 
/* parser: разбор выражения с занесением его в результ. строку */
void parser(char *res, char *expr)
{
    int i, c;
    int isbr = 0;   /* счетчик скобок */
 
    for(i = 0; expr[i] != '\0'; i++) {
        if(isalnum(expr[i]))            /* помещаем число или переменную в результ. строку */
            addtores(res, expr[i]);
 
        if( (expr[i] == '=' || expr[i] == '+' || expr[i] == '-' 
                    || expr[i] == '*' || expr[i] == '/') && !checkstack(expr[i]) )
            push(expr[i]);
        else if(checkstack(expr[i])) {  /* выталкиваем из стэка операторы с большим */ 
            while(checkstack(expr[i]))  /* или равным приоритетом */
                addtores(res, pop());    
            push(expr[i]);
        }
 
        if(expr[i] == '(') {            /* скобки */
            push(expr[i]);
            isbr++;
        } else if(expr[i] == ')' && isbr) {
            while( (c = pop()) != '(' )
                addtores(res, c);
            isbr--;
        } else if(expr[i] == ')' && !isbr)
            eprintf("incorrect brackets");
    }
    if(isbr != 0)
        eprintf("incorrect brackets");
    while((c = pop()) != EOF)           /* заносим в результ. строку оставшиеся элементы в стэке */
        addtores(res, c);
}
 
/* postfix: преобразование выражения к обратной польской записи */
int main(void)
{
    char res[NRES] = { '\0' };          /* результирующая строка */
 
    parser(res, "((a-b)/(c-d)+f)*e.");  /* выражение */
    printf("res: %s\n", res);
 
    return 0;
}


eprintf.h
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
 
void eprintf(char *, ...);
void weprintf(char *, ...);
char *estrdup(char *);
void *emalloc(size_t );
static void setprogname(char *);
static char *progname(void);
static char *name;
 
void eprintf(char *fmt, ...)
{
    va_list args;
    
    if(progname() != NULL)
        fprintf(stderr, "%s: ", progname());
        
    va_start(args, fmt);
    vfprintf(stderr, fmt, args);
    va_end(args);
    
    if(fmt[0] != '\0' && fmt[strlen(fmt)-1] == ':')
        fprintf(stderr, " %s", strerror(errno));
    fprintf(stderr, "\n");
    
    exit(2);
}
 
void weprintf(char *fmt, ...)
{
    va_list args;
    
    if(progname() != NULL)
        fprintf(stderr, "%s: ", progname());
        
    va_start(args, fmt);
    vfprintf(stderr, fmt, args);
    va_end(args);
    
    if(fmt[0] != '\0' && fmt[strlen(fmt)-1] == ':')
        fprintf(stderr, " %s", strerror(errno));
    fprintf(stderr, "\n");
}
 
char *estrdup(char *s)
{
    char *p;
    
    p = (char *) malloc(strlen(s)+1);
    if(p == NULL)
        eprintf("estrdup (/%.20s/) failed:", s);
    strcpy(p, s);
    
    return p;
}
 
void *emalloc(size_t n)
{
    void *p;
    
    p = malloc(n);
    if(p == NULL)
        eprintf("malloc of %u bytes failed:", n);
    return p;
}
 
static void setprogname(char *str)
{
    name = estrdup(str);
}
 
static char *progname(void)
{
    return name;
}
1
1 / 1 / 1
Регистрация: 29.08.2009
Сообщений: 63
06.09.2009, 19:06 5
Цитата Сообщение от Gravity Посмотреть сообщение
Когда-то делал такое.
эко тебя торкруло
можно было свободно скачать с алголиста исходник

я сам как-то не долюбливаю стековые машины - зы вчера студенту калькулятор писал рекурсивным нисходящим синтаксическим анализатором, может его можно прикрутить к ОПН?
0
Эксперт С++
7175 / 3234 / 79
Регистрация: 17.06.2009
Сообщений: 14,164
06.09.2009, 19:08 6
рекурсивным нисходящим синтаксическим анализатором
Рекурсивный - значит там используется стек
0
1 / 1 / 1
Регистрация: 29.08.2009
Сообщений: 63
06.09.2009, 19:15 7
че-то из задания не понятно, им последовательность нужно расписывать на бумаге или кодить?
0
Эксперт С++
7175 / 3234 / 79
Регистрация: 17.06.2009
Сообщений: 14,164
06.09.2009, 19:16 8
Не ясно что им нужно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.09.2009, 19:16

Структуры и алгоритмы компьютерной обработки данных (очередь)
Нужно сделать программу: Создать очередь клиентов и распределить клиентов по двум вспомогательным...

Тест по Структуры и алгоритмы обработки данных очень прошу проверьте пожалуйста мои ответы
Я ответы проставила ,проверьте пожалуйста Какие условия необходимы для применения простейшей...

Алгоритмы обработки данных
Дополнить класс, описывающий стек на основе односвязного списка, методом: вычисляющим значение...

Алгоритмы обработки данных в MSQL
Есть таблица, нужно извлечь уникальные значения из столбца &quot;столбец1&quot; То есть результатом работы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru