0
I’m trying to create a program that checks a certain sequence and returns whether it is well formed or poorly formed. I’d like to make the chained list behave like a pile, but I’m having trouble with three functions (Stack* push (Stack *s, int elem)
, Stack* pop (Stack *s)
and int top (Stack *s)
). If you can shed a light I’ll send you my code.
#include <stdio.h>
#include <stdlib.h>
typedef struct stack {
int info;
struct stack *next;
} Stack;
/*Função para criar uma pilha vazia (não criar nenhum nó, só devolver NULL)!*/
Stack* create_stack () {
return NULL;
}
/*Função para liberar uma pilha nó por nó*/
void free_stack (Stack *s) {
Stack *aux;
while (s != NULL) {
aux = s->next;
free(s);
s = aux;
}
}
/*Função para empilhar um elemento (inserir na cabeça da lista encadeada)!*/
Stack* push (Stack *s, int elem) {
Stack *novo =(Stack*)malloc(sizeof(Stack));
novo->info = elem;
Stack *oldHead = novo->next;
s->next = novo;
novo->next = oldHead;
return novo;
}
/*Função para desempilhar um elemento (remover da cabeça da lista encadeada)!*/
Stack* pop (Stack *s) {
if(s->next == NULL){
printf("Lista ja vazia\n\n");
return NULL;
}else{
Stack *ultimo = s->next,
*penultimo = s;
while(ultimo->next != NULL){
penultimo = ultimo;
ultimo = ultimo->next;
}
penultimo->next = NULL;
return ultimo;
}
}
/*Função para retornar o elemento no topo da pilha (cabeça da lista encadeada) sem desempilhar!*/
int top (Stack *s) {
Stack *v;
for (v = s; v != NULL; v = v->next) {
if(v->next == NULL){
return v->info;
}
}
}
/*Função para testar se uma pilha está vazia!*/
int empty_stack (Stack *s) {
if(s->next==NULL){
return 1;
}
else{
return 0;
}
}
int main () {
char *seq = "[ ( ) ]";
int i = 0;
Stack *p = create_stack(strlen(seq));
while (seq[i] != '\0') {
if ( (seq[i] == '(') || (seq[i] == '[') ) {
p = push (p, seq[i]);
}
else if (seq[i] == ')') {
if (empty_stack(p) || top(p) != '(') {
printf("mal formada\n");
return 0;
}
p = pop (p);
}
else if (seq[i] == ']') {
if (empty_stack(p) || top(p) != '[') {
printf("mal formada\n");
return 0;
}
p = pop (p);
}
i++;
}
if (empty_stack(p)) {
printf("bem formada\n");
}
else {
printf("mal formada\n");
}
return 0;
}
I tried to reformulate the functions pop() / push() and top() but still giving Gmentation fault. Follow code:
#include <stdio.h>
#include <stdlib.h>
typedef struct stack {
int info;
struct stack *next;
} Stack;
/*Função para criar uma pilha vazia (não criar nenhum nó, só devolver NULL)!*/
Stack* create_stack () {
return NULL;
}
/*Função para liberar uma pilha nó por nó*/
void free_stack (Stack *s) {
Stack *aux;
while (s != NULL) {
aux = s->next;
free(s);
s = aux;
}
}
/*Função para empilhar um elemento (inserir na cabeça da lista encadeada)!*/
Stack* push (Stack *s, int elem) {
Stack *novo =(Stack*)malloc(sizeof(Stack));
novo->info = elem;
novo->next = NULL;
Stack* v = s;
while(v->next != NULL){
v = v->next;
}
v->next = novo;
return s;
}
/*Função para desempilhar um elemento (remover da cabeça da lista encadeada)!*/
Stack* pop (Stack *s) {
Stack *ultimo = s;
Stack *penultimo = NULL;
if(s == NULL){
printf("Lista ja vazia\n\n");
return NULL;
}else{
while(ultimo->next != NULL){
penultimo = ultimo;
ultimo = ultimo->next;
}
penultimo->next = NULL;
free(ultimo);
return s;
}
}
/*Função para retornar o elemento no topo da pilha (cabeça da lista encadeada) sem desempilhar!*/
int top (Stack *s) {
Stack *v;
for (v = s; v != NULL; v = v->next) {
if(v->next == NULL){
return v->info;
}
}
}
/*Função para testar se uma pilha está vazia!*/
int empty_stack (Stack *s) {
if(s == NULL){
return 1;
}
else{
return 0;
}
}
int main () {
char *seq = "[ ( ) ]";
int i = 0;
Stack *p = create_stack(strlen(seq));
while (seq[i] != '\0') {
if ( (seq[i] == '(') || (seq[i] == '[') ) {
p = push (p, seq[i]);
}
else if (seq[i] == ')') {
if (empty_stack(p) || top(p) != '(') {
printf("mal formada\n");
return 0;
}
p = pop (p);
}
else if (seq[i] == ']') {
if (empty_stack(p) || top(p) != '[') {
printf("mal formada\n");
return 0;
}
p = pop (p);
}
i++;
}
if (empty_stack(p)) {
printf("bem formada\n");
}
else {
printf("mal formada\n");
}
return 0;
}
What are the specific difficulties you have in this task ?
– Isac
is giving Segmentation fault if you run the code. and I’m pretty sure the error is in these 3 functions. I’m trying here but I’m not getting it.
– user144352