Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Баланс на Скоби - С

Featured Replies

Задачата трябва да извършва проверка за баланс на скобите.

Идеята е следната,при откриване на скоба,ако е отваряща - се пъха в стека,ако е отваряща се изкарва последната от стека и се сравняват,ако са от един вид(примерно '(' и ')'  ),всичко е наред,махаме последната от стека и продължаваме.

Нещо не работи както трябва.

 

 

#include "stdafx.h"
#include<stdlib.h>

struct s{
       char skoba;
       struct s* next;
       };
typedef struct s TYPE;

void deleteLast(TYPE** stack)
{
     *stack=(*stack)->next;
 }

void add(char receivedCharacter,TYPE** stack){
     
     TYPE* buff=(TYPE*)malloc(sizeof(TYPE));
     buff->skoba=receivedCharacter;
     buff->next=(*stack);
     (*stack)=buff;
}
char pop(TYPE** stack){
      
      char buffer = (*stack)->skoba;
      (*stack)=(*stack)->next;
      
      
      
      return buffer;
}


int _tmain(int argc, _TCHAR* argv[])
{
    TYPE* stack=(TYPE*)malloc(sizeof(TYPE));
  stack=NULL;
 
  int count=0;
  char* equation="[[[[]]]]";
 
 
 
 
 
    int FLAG=1;
    
    while(*equation && FLAG)//obhojdame celiq tekst
    {
         if(*equation==123 || *equation==125 || *equation==91  || *equation==93  || *equation==40 || *equation==41)//ako e skoba
         {
            if (*equation==40 || *equation==91 || *equation==123)//skobata e otvarq6ta
            add(*equation,&stack);
            
            else//zatvarq6ta e skobata
            {
              char buff=pop(&stack);//buff e poslednata otvarq6tq skoba v steka
               
               if(buff==41)
                 if(*equation==buff-1)//ima syotvetskie zatvarq6ta otvarq6ta
                 {
                   FLAG=1;
                   deleteLast(&stack);//mahame naigorniq
                 }
                 else FLAG=0;
                 
               if(buff==91 || buff==93)
                 if(*equation==buff-2)
                 {
                   FLAG=1;
                   deleteLast(&stack);
                 }
                 else FLAG=0;     
            }            
        }             
        equation++;
    }
 
 
 
 
printf("RESULT=%d!!",FLAG);  
    return 0;
}

Нещо не работи както трябва.

По-скоро хич нищо не работи:

  • Операциите със стека: Като заделяш динамично памет, да я триеш някъде? При изпълнение на pop и deleteLast директно получаваш теч. Инстанцията на стека не трябва да я заделяш, защото така получаваш един неопределен празен елемент. Освен това и двете махат елемента от върха на стека което значи че ти махаш и един елемент допълнително, като ги викаш и двете.
  • Условната логика: Писал си 91 вместо 125 в едното условие. Освен това, така, както са написани проверките за затварящи скоби, само резултата от последната има значение.
  • Автор

Направих някои корекции,но не винаги работи.

Това с "изтичането",не го разбрах,може ли да ми обясниш какво точно е това?

 

#include "stdafx.h"
#include<stdlib.h>

struct s{
       char skoba;
       struct s* next;
       
       
       };
typedef struct s TYPE;

void deleteLast(TYPE** stack)
{

     TYPE* oldStack = (TYPE*)malloc(sizeof(TYPE));

     oldStack=*stack;

     *stack=(*stack)->next;

     free(oldStack);
 }

void add(char receivedCharacter,TYPE** stack){
     
     TYPE* buff=(TYPE*)malloc(sizeof(TYPE));
     buff->skoba=receivedCharacter;
     buff->next=(*stack);
     (*stack)=buff;
}
char pop(TYPE** stack){
      
      return (*stack)->skoba;
}


int _tmain(int argc, _TCHAR* argv[])
{
    TYPE* stack=(TYPE*)malloc(sizeof(TYPE));
  stack=NULL;
 
  int count=0;
  char* equation="[]";
 
 
 
 
 
    int FLAG=1;
    
    while(*equation && FLAG)//obhojdame celiq tekst
    {
         if(*equation==123 || *equation==125 || *equation==91  || *equation==93  || *equation==40 || *equation==41)//ako e skoba
         {
            if (*equation==40 || *equation==91 || *equation==123)//skobata e otvarq6ta
            add(*equation,&stack);
            
            else//zatvarq6ta e skobata
            {
              char buff = pop(&stack);
                  
                 if(buff==*equation-1)
                 {
                     FLAG=1;
                     deleteLast(&stack);
                 }
                 else if (buff==*equation-2)
                      {
                          FLAG=1;
                          deleteLast(&stack);
                      }
                      else
                          FLAG=0;


            }            
        }             
        equation++;
    }
 
 
 
 
printf("RESULT=%d!!",FLAG);  
    return 0;
}

Направих някои корекции,но не винаги работи.

Това с "изтичането",не го разбрах,може ли да ми обясниш какво точно е това?

 

Memory leak - да заделяш памет, но никога да не я освобождаваш. В случая от първия ти пример, ако пуснеш кода от main() в един while(true) цикъл и оставиш програмата да поработи известно време, необходимата ѝ памет ще се увеличава с всяка итерация, докато рано или късно свободната памет на ОС не свърши. Правилното поведение е след всяка итерация, заделената от стека памет да се освобождава и програмата да не увеличава изискваната от нея памет с течение на времето.

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    26%
    Дарени 256.00 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.