Programm, um die balance der Klammern
Hallo ich habe ein string-array, das die Werte enthält, die als "{[()]}", "}[]{", "{()[]". Jetzt habe ich, um die balance der Klammern wie für jedes Start-Klammer, z.B. { oder [ oder (, es muss eine schließende Klammer. Wenn der input-string hat die gleiche Anzahl öffnende und schließende Klammern, dann ist die Ausgabe "JA" sonst "NEIN". Auch wenn der string hat eine schließende geschweifte Klammer vor eine passende öffnende Klammer dann auch die Ausgabe "NEIN". Also im Grunde hat die Ausgabe zu einem string-array, werden die Werte enthalten, wie dies für die oben genannten input-Zeichenfolge-array : "JA", "NEIN", "NEIN".
Schrieb ich das folgende Programm, das eine Menge von if-else-Bedingung. Ich Frage mich, ob es keine bessere Möglichkeit in C#, um mit diesem problem umzugehen.
static void Main(string[] args)
{
string[] arrBraces = Console.ReadLine().Split(' ');
string[] result = new String[arrBraces.Length];
for (int i = 0; i < arrBraces.Length; i++) {
Console.WriteLine(arrBraces[i]);
int curly = 0, square = 0, round = 0;
foreach (char c in arrBraces[i]) {
if (c == '{') {
curly++;
} else if (c == '[') {
square++;
} else if (c == '(') {
round++;
} else if (c == '}') {
if (curly > 0) {
curly--;
} else {
curly = -1;
break;
}
} else if (c == ']') {
if (square > 0) {
square--;
} else {
square = -1;
break;
}
} else if (c == ')') {
if (round > 0) {
round--;
} else {
round = -1;
break;
}
}
}
if (curly == 0 && square == 0 && round == 0) {
result[i] = "YES";
} else {
result[i] = "NO";
}
}
foreach (string str in result) {
Console.WriteLine (str);
}
Console.ReadKey();
}
Fand ich eine ähnliche Frage hier aber so wie es scheint, ist auch die gleiche Sache, nur, dass es mit stack zum speichern der Klammer in der Erwägung, dass mein problem erklärt ausdrücklich, dass die Klammern in einem string-array.
Sowieso jede Hilfe oder Anregungen zur Verbesserung der code wäre sehr hilfreich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Folgen Sie den unten algo:
1) Verwenden Sie einen Stapel
2) Lesen string von Links
3) push-to-stack, wenn aktuelle lese-Brief ist geöffnet Klammer ('(','{','[')
4) pop vom stack, wenn aktuelle lese-Brief ist geschweifte Klammer.
5) Überprüfen Sie die geknallt Klammer mit der die aktuelle lese-Klammer
5.a) wenn es das pairing Klammer. ok weiter
5.b) wenn stack leer war, dann ist der Druck NICHT
5.c) wenn knallte char und Lesen char nicht ein paar drucken Sie dann KEINE
6) wenn alle der Zeichenfolge verarbeitet werden. überprüfen Sie die Länge des Stapels.
6.a) wenn die Länge 0 ist print JA
6.b) sonst der Druck NICHT
Kann man sicherlich machen diese mehr prägnant:
Beachten Sie, dass in diesem Fall die
else
s sind nicht unbedingt notwendig. Sie können nurif
jeder Charakter option. Es kann eine mikroskopische performance-Vorteil zu nutzenelse
hier, aber ich würde erwarten, dass der compiler zu optimieren, Weg keinen Unterschied. Wenn Sie dies nicht möchten, können Sie auch einswitch
- Anweisung.Vollständigkeit halber, hier ist ein
Main()
verwendet diese Funktion:Einer Sache, die nicht klar aus der Frage, ob dies legal ist:
Es ist legal, nach dem Beispiel-code, und als dieser sieht aus wie eine Praxis-übung kann es keine Rolle. Aber für die realen Probleme beschrieben, die durch diese übung, dieses oft (nicht immer, aber oft) nicht legal und wird als "unsymmetrisch". Wenn es nicht egal ist, müssen Sie die Verwendung eines einzigen
Stack
eher als die einzelnen Summen, und IhreCheckString()
Methode könnte wie folgt Aussehen:false
für}[]{
weil es prüft, ob eine negative total nach jedem Zeichen, und gibt sofort, wenn er eine findet. Es wird nicht halten lange genug, um zu sehen, die{
Charakter.Main[]
um es schneller zu machen, um zu überprüfen, wie sich änderungen am code werden die Ergebnisse beeinflussen.in jeder situation die inneren Elemente in symmetrischen Fall sein sollte (), {} oder []
Ich würde eine queue und stack als solche
als ein Beispiel der ersten iteration a = '{' und b ='}'
Könnte genau dies tun...