Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/39: Рейтинг темы: голосов - 39, средняя оценка - 4.92
Jazzman

[C++] Синтаксис скобок

21.12.2010, 20:26. Показов 7475. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, вот задача:

Используя стек, определить функцию проверки правильности расстановки скобок в алгебраическом выражении. Выражение содержит скобки 3х видов (круглые, квадратные, фигурные)

Собсна написал текст, а ответ выдает неправильный, помогите пожалст...

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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include <condefs.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
//----------------СТЕК-------------------------
const int maxsize=50;
char values[maxsize];
int top=0;
 
bool empty()
     {
      if (top==0) return true;
         else return false;
     }
 
void push(char c)
     {
      if (top==maxsize) ShowMessage("Overflow in stack!!!");
         else values[top++]=c;
     }
 
void pop(char &c)
     {
      if (empty()) ShowMessage("Stack is empty!!!");
         else c=values[--top];
     }
 
bool kr(char c)
        {
        if ((c=='(') || (c==')'))
           return true;
        else return false;
        }
 
bool kv(char c)
        {
        if ((c=='[') || (c==']'))
           return true;
        else return false;
        }
 
bool fig(char c)
        {
        if ((c=='{') || (c=='}'))
           return true;
        else return false;
        }
 
//--------------------------------------------------------------
 
//---------------------------ПРОВЕРКА---------------------------
bool Res (char *in)
{
int i=0;
char c;
while (in[i]!='%')
{
        if (empty()==true)
        push(c);
        else if (kr(in[i])==true)
             {pop(c);
                if ((kr(c)==false) || (c==in[i]))
                {
                        push(c);
                        push(in[i]);
                }
              }
        else if (kv(in[i])==true)
              {pop(c);
                 if ((kv(c)==false) || (c==in[i]))
                 {
                 push(c);
                 push(in[i]);
                 }
              }
        else if (fig(in[i])==true)
              { pop(c);
                 if ((fig(c)==false) || (c==in[i]))
                 {
                 push(c);
                 push(in[i]);
                 }
              }
i++;
}
if (empty) return false;
else return true;
}
//----------------------------------------------------
 
 
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char formula[100]="";
int  k=0, i=0;
 
strcpy(formula, (Edit1->Text).c_str());
while (formula[i]!=NULL) {i++; k++;}
formula[k+1]='%';
 
if (Res(formula)==true) Label1->Caption="Скобки расставленны верно";
else Label1->Caption="Скобки расставлены НЕ ВЕРНО";
}
 
//---------------------------------------------------------------------------
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.12.2010, 20:26
Ответы с готовыми решениями:

Вывести все корректные комбинации пар круглых скобок, которые можно сформировать из n скобок
Вывести все корректные комбинации пар круглых скобок, которые можно сформировать из n скобок, которые закрываются и открываются. Количество...

Синтаксис, скобки, приоритеты, ассоциативность - уменьшить количество скобок в строке кода
вопрос прост, как уменьшить количество скобок в выражении? (int(Char.MaxValue) = int(UInt16.MaxValue))

Проверить правильность расстановки в строке скобок (баланс открывающих и закрывающих скобок)
помогите с решением задачи. Запросить у пользователя ввод значений согласно варианту. Выполнить задание согласно варианту. После...

1
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.12.2010, 12:56
Алгоритм следующий. Пока просматриваемая строка не пуста:
  1. если очередной символ - открывающая скобка, помещаем ее в стек и переходим к следующему символу;
  2. если очередной символ закрывающая скобка:
    1. если стек пуст, то выражение - неправильное;
    2. если символ на вершине стека не является соответствующей открывающей скобкой, то выражение - неправильное;
    3. в противном случае, вынимаем из стека символ.
    Переходим к следующему символу
  3. если очередной символ не является символом скобки, то переходим к следующему символу.
Если после просмотра всего выражения стек пуст, то выражение - правильное, в противном случае - неправильное.
Вот пример программы:
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
#include <stdio.h>
#include <stdlib.h>
 
struct stack
{
    char            data;
    struct stack*   next;
};
 
struct stack*   push(struct stack*, char);
char            pop(struct stack**);
void            del(struct stack**);
 
char openingP(char);
int checkP(const char*);
 
int main(int argc, char** argv)
{
    if(argc == 1)
    {
        fprintf(stderr, "Использование: %s Выражение...\n", argv[0]);
        exit(1);
    }
    
    for(size_t i = 1; i < argc; ++i)
        printf("Расстановка скобок в выражении \'%s\': %s\n",
                argv[i], (checkP(argv[i]) ? "правильная" : "неправильная"));
                
    exit(0);
}
 
struct stack* push(struct stack* stk, char c)
{
    struct stack* newNode;
    if(!(newNode = (struct stack*) malloc(sizeof(struct stack))))
    {
        fprintf(stderr, "malloc: не удалось выделить память под узел стека\n");
        exit(2);
    }
    newNode->data = c;
    newNode->next = stk;
    return newNode;
} 
 
char pop(struct stack** stk)
{
    if(!stk)
    {
        fprintf(stderr, "pop: стек уже пуст\n");
        exit(3);
    }
    char retVal = (*stk)->data;
    struct stack* delNode = *stk;
    *stk = (*stk)->next;
    free(delNode);
    return retVal;
}
 
void del(struct stack** stk)
{
    while(*stk)
    {
        struct stack* delNode = *stk;
        *stk = (*stk)->next;
        free(delNode);
    }
}
 
char openingP(char c)
{
    switch(c)
    {
    case '}':
        return '{';
    case ')':
        return '(';
    case '>':
        return '<';
    }
    return 0;
}
 
int checkP(const char* str)
{
    struct stack* stk = NULL;
    while(*str)
    {
        if((*str == '{') || (*str == '(') || (*str == '<'))
            stk = push(stk, *str++);
        else if((*str == '}') || (*str == ')') || (*str == '>'))
        {
            char o = openingP(*str++);
            
            if(stk == NULL)
                return 0;
            else if(pop(&stk) != o)
            {
                del(&stk);
                return 0;
            }
        }
        else
            ++str;
    }
    if(stk != NULL)
    {
        del(&stk);
        return 0;
    }
    return 1;
}
И пример использования:
Bash
1
2
3
4
5
nameless@nameless-desktop:~/foo$ ./foo '()(})' '({(dv<df>)}kd<{v}>d)' '(o{}' ')'Расстановка скобок в выражении '()(})': неправильная
Расстановка скобок в выражении '({(dv<df>)}kd<{v}>d)': правильная
Расстановка скобок в выражении '(o{}': неправильная
Расстановка скобок в выражении ')': неправильная
nameless@nameless-desktop:~/foo$
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.12.2010, 12:56
Помогаю со студенческими работами здесь

Как перевести синтаксис макроса VBA (Excel) в синтаксис Visual FoxPro
Здравствуйте! Скажите пожалуйста, как перевести синтаксис записанного макроса в excel в синтаксис FoxPro? Нужно, чтобы из FoxPro...

Как перевести синтаксис Intel в синтаксис AT&T? (ассемблерная вставка в СИ)
Извиняюсь, что, возможно, пишу не в ту тему. Нужен именно AT&amp;T синтаксит. В качестве примера для курсовой я разбираю перемножение...

Ввести произвольный текст. Проверить, в заданном тексте количество открытых скобок равно количеству закрытых скобок.
Помогите сделать задачу: Ввести произвольный текст. Проверить, в заданном тексте количество открытых скобок равно количеству закрытых...

Внести произвольный текст. Проверить в заданном тексте количество открытых скобок равно числу закрытых скобок
Внести произвольный текст. Проверить в заданном тексте количество открытых скобок равно числу закрытых скобок.

Удалить часть текста, заключённую в скобки вместе со скобками. Внутри каждой пары скобок нет других скобок.
1. Удалить часть текста, заключённую в скобки вместе со скобками. Внутри каждой пары скобок нет других скобок. 2. составить файл с...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru