Mit Stacks In C++ für die infix-und postfix-Ausdrücke
Bin ich ein Programm schreiben, das nimmt Benutzereingaben und verwendet stapeln Umwandlung eines infix-Ausdruck in einen postfix-Ausdruck, basierend auf Vorrang, mit Operanden, die immer gehen, bevor die Betreiber. Zum Beispiel, wenn ein Benutzer Eingänge:
(a+b*c)
dann sollte das Programm anzeigen:
abc*+
bisher habe ich dieses:
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main()
{
stack<char> s;
char input;
while (cin.get(input) && input != '\n')
{
if (isalnum(input))
cout << input << "\n";
else if (input == '(')
s.push(input);
else if (input == ')')
{
while (!s.empty() && s.top() != '(')
{
cout << s.top();
s.pop();
}
if(!s.empty())
s.pop();
else
cout << "ERROR: No Matching ( \n";
}
else if (s.empty() && input == '*'||'/'||'+'||'-' && s.top() < input) //Error Begins Here?
{
char a = '*';
char b = '/';
char c = '+';
char d = '-';
bool prec (char a, char b, char c, char d);
return ('*' > '/' > '+' > '-');
s.push(input);
}
else if (input == '*'||'/'||'+'||'-' && s.top() >= input)
while (!s.empty())
{
cout << s.top();
s.pop();
s.push(input);
}
}
while (!s.empty())
{
cout << s.top();
s.pop();
}
}
Denen kompiliert und ausgeführt, aber funktioniert nicht wie es sollte. Wenn ein Ausdruck wie "ab" eingegeben, zeigt das Programm "ab", wie es sollte, aber wenn ich Eingang "a+b+c", dann nur "a" angezeigt. Dies bedeutet, dass das Programm nicht die Platzierung der Operatoren in den stack angezeigt werden später. Was ich brauche Hilfe bei änderung des Programms, so dass, wenn ein Bediener die Eingabe, es sollte Hinzugefügt werden auf den Stapel und dann wird basierend auf den Vorrang (*>/>+>-) nach dem Operanden, wenn die Eingabe beendet ist.
Ich bin ganz neu bei C++ und der Programmierung im Allgemeinen, also irgendwelche Vorschläge wäre toll.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese nicht tun, was Sie denken, es tut. Sie tun müssen,
Und das sieht wie ein Fehler zu
Das ist die syntax für eine Funktion Prototyp. Sind Sie sicher, dass dies kompiliert?
if ((input == '*' || input == '/' || input == '+' || input == '-') && s.top() >= input)
Das problem ist hier:
Ich vermute, dies ist gedacht, um zu definieren, eine Vorrang-Funktion, aber das ist nicht das, was es tut. Die erste Zeile erklärt, dass solch eine Funktion existiert (und seine Argumente haben nichts mit den Variablen, die in den vorhergehenden Zeilen), und die zweite bewirkt, dass das ganze Programm zu beenden. Wenn Sie möchten, dass eine Funktion wie diese, müssen Sie es außerhalb
main
.Einer etwas weniger dramatischen Fehler ist hier:
Ersten, dieser Teil
wird interpretiert als
Den letzten drei Bedingungen wahr sind, das erste ist irrelevant. Und ich bin mir auch nicht sicher, was
s.top()
tut, wenn s leer ist.Dies sollte genug sein, um zu gehen. Ich schlage vor, Sie beginnen, indem Sie die Erstellung und das testen von Routinen, kann, z.B., zu identifizieren, zusammenzustellen und zu bewerten, Ihre Rangfolge, bevor Sie versuchen, indem Sie alles zusammen in einem Programm.
Falmarri richtig ist, nur posten wollte, dass mein selbst , und es kompiliert wird, ich habe es versucht , aber es ist eine andere Sache : Sie sagten,
else if (s.empty() && input == '*'||'/'||'+'||'-' && s.top() < input) //Error Begins Her
e?Sind Sie sicher, dass auch jetzt den Punkt erreicht, denn wenn ich runn , es hört einfach auf die :
bis ich enter drücken und noch mehr können Sie mehr als einen char von consol, während in cin.get(input), aber die Eingabe nur der ersten Zeichen, die Sie eingegeben haben . Um dieses Problem zu lösen ich habe nur einen
#include <conio.h>
am Anfang verwendetkurze Erklärung
zurück, nachdem Sie drücken nur ein Zeichen und
Eingabe != (char)13
erforderlich ist in der biederen
Eingabe != '\n'
da getch() return (char)13 für die EINGABE siehe ASCII-Tabelle für weitere Informationen.