C :: Aufgabe #54 :: Lösung #1

1 Lösung Lösung öffentlich
#54

Klammerebenen checken

Anfänger - C von bibir - 03.09.2014 um 09:22 Uhr
Ein übergebener String enthält neben anderen (bedeutungslosen) Zeichen öffnende und schließende Klammern, wobei die Klammern rund(), eckig [] oder geschweift {} sein können.

In einem Programm/Skript ist zu überprüfen, ob Klammern korrekt gesetzt wurden. Dabei gilt:
- jede sich öffnende Klammer wird von einer Klammer gleicher Art wieder geschlossen
- jede sich schließende Klammer wurde von einer Klammer gleicher Art geöffnet
- ein Klammernpaar darf nicht durch andere Klammernpaare überschnitten werden

Beispiele:
(([[]])) => true
([)] => false
([]]) => false
(())) => false
(() => false
({[])} => false
Gar keine Klammern => true
#1
vote_ok
von devnull (8870 Punkte) - 06.09.2014 um 22:06 Uhr
Quellcode ausblenden C-Code
/*******************************
 * chkbra.c     check brackets
 *******************************/
#include <stdio.h>
 
#define STACKSIZE  255

char brackets[STACKSIZE+1];
int braptr = 0;

// bracket push
int bra(char c) {
	if (braptr < STACKSIZE) {
		brackets[braptr++] = c;
		return 0;
	}
	return 1;
}

// bracket pop
int ket(int c) {
	if (braptr > 0 && (c - brackets[braptr-1]) <= 2) {
		braptr--;
		return 0;
	}
	return 1;
}

// check brackets in string 
int chk_brackets(char *s) {
    char *ps = s;
    int c, pos;
    
    while ((c = *ps) != '\0') {
		pos = (int)(ps-s);
		if (c=='(' || c=='[' || c=='{') {
			if (bra(c)) {
				printf("stack overflow at p. %d.\n", pos);
				return 1;
			}
		}
		if (c==')' || c==']' || c=='}') {
			if (ket(c)) {
				printf("closing bracket mixed or unbalanced at p. %d.\n", pos);
				return 1;
			}
		}
		ps++;
    }
    if (braptr > 0) {
		printf("opening brackets unbalanced.\n");
		return 1;
	}
    return 0;
}

// main 
int main(int argc, char **argv) {
	return (argc>1) ? chk_brackets(argv[1]) : 0;
}

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben