Я попытался написать средство проверки скобок на c, используя стеки массивов. Код не выдает сообщений об ошибках, но иногда дает правильный вывод, а иногда неправильный. Мы будем очень благодарны за то, как я могу улучшить код, или любые другие предложения. Я начинающий программист на C. Я попытался принять ввод как строку, но не смог. Какие-либо предложения?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 25
int top = -1;
char stack[MAX];
void push(char x)
{
if (top == MAX - 1){
printf("Stack Overflow\n");
return;
}
stack[++top] = x;
}
char pop()
{
char popped;
if (top == -1) {
printf("Stack Underflow\n");
return 0;
}
popped = stack[top];
--top;
return popped;
}
char Top()
{
return (stack[top]);
}
int arePair(char opening,char closing)
{
if (opening =='(' && closing == ')') return 1;
else if ((opening =='{' && closing == '}')) return 1;
else if (opening =='[' && closing == ']') return 1;
return 0;
}
int paranthesesBalanced(char *exp,int size)
{
for (int i=0;i<size;i++)
{
if (exp[i] == '(' || exp[i] == '{' || exp[i] == '[')
push(exp[i]);
else if (exp[i] == ')' || exp[i] == '}'|| exp[i] == ']')
{
if (top == -1 || !arePair(Top(),exp[i]))
return 0;
else
pop();
}
}
return (top == -1 ? 1:0);
}
int main()
{
char exp[25];
int size=0;
printf("Enter the size of
expression\n");
scanf("%d",&size);
printf("Enter the expression(Less than
25 characters): \n");
//scanf("%[ˆ\n]%",exp);
for (int i=0;i<size;i++)
{
scanf("%c",&exp[i]);
}
if (paranthesesBalanced(exp,size))
printf("Balanced!\n");
else
printf("Not Balanced!\n");
}
когда я ввожу ()
, он дает несбалансированный
Вы пробовали использовать как можно больше операторов печати в разных точках, чтобы проверить, где что-то идет не так, или проверять это с помощью ручки и бумаги, просматривая все это - иначе используйте отладчик.
Я этого не делал. Я не умею пользоваться отладчиком. какие-либо предложения?
@dsaharia Если в вашей системе установлен GDB (проверьте, запущен ли gdb --version) на вашем терминале, то вот ссылка на это: youtube.com/watch?v=sCtY--xRUyI Иначе используйте несколько операторов печати, которые также вам помогут.
Спасибо. Есть другие предложения?
Я согласен с приведенными выше комментариями, что вам следует потратить некоторое время на то, чтобы научиться отлаживать свои программы.
Проблема с вашим кодом заключается в том, как вы читаете вводимые пользователем данные. % c соответствует всем символам, включая символ новой строки. Ваш код в текущей форме считывает новую строку между размером пользовательских данных и самими данными как первый символ ввода, поэтому exp [0] == '\ n'. Есть несколько способов решить проблему, например, очистить ввод или раскомментировать строку, которую вы прокомментировали (и избавиться от лишнего знака процента или переключиться на другой способ чтения ввода, например, используя% s вместо использования% c в цикле.
Надеюсь, это поможет.
Вот минимальная модифицированная версия, которая работает правильно:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 25
int top = -1;
char stack[MAX];
void push(char x)
{
if (top > MAX - 1){ //CHANGED
printf("Stack Overflow\n");
return;
}
stack[++top] = x;
}
char pop()
{
char popped;
if (top == -1) {
printf("Stack Underflow\n");
return 0;
}
popped = stack[top];
--top;
return popped;
}
char Top()
{
return (stack[top]);
}
int arePair(char opening,char closing)
{
if (opening =='(' && closing == ')') return 1;
else if ((opening =='{' && closing == '}')) return 1;
else if (opening =='[' && closing == ']') return 1;
return 0;
}
int paranthesesBalanced(char *exp,int size)
{
for (int i=0;i<size;i++)
{
if (exp[i] == '(' || exp[i] == '{' || exp[i] == '[')
push(exp[i]);
else if (exp[i] == ')' || exp[i] == '}'|| exp[i] == ']')
{
if (top == -1 || !arePair(Top(),exp[i]))
return 0;
else
pop();
}
}
return (top == -1 ? 1:0);
}
int main()
{
char exp[25];
int size=0;
printf("Enter the size of xpression\n");
scanf(" %d",&size);
printf("Enter the expression(Less than 25 characters): \n");
scanf("%s",exp); //DELETED FOR LOOP - BETTER USE GETCHAR() RATHER THAN SCANF
printf("%s\n",exp);
if (paranthesesBalanced(exp,size))
printf("Balanced!\n");
else
printf("Not Balanced!\n");
}
Вместо scanf
вы можете пойти этим путем, поскольку scanf
не поддерживает пробел, т.е. если вы введете hello world
, он будет читать только hello
. Альтернатива:
int i,count++;
while((i=getchar())!=EOF)
{
if ((i!=\0')&&(count<MAX))
exp[count++]=i;
else
break;
}
Таким образом вы можете легко проверить длину выражения и ее пределы + это позволит вам ввести пробел.
printf ("% s \ n", exp) вызовет переполнение стека, когда пользовательский ввод длиннее 25 символов здесь, "% 24s" будет лучше.
@robal Вот почему я предложил getchar
оставить чек :)
начать с ввода: когда дает ли он вам выход неправильный?