C :: Aufgabe #54
1 Lösung
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
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
Lösungen:
/*******************************
* 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;
}
