#include <iostream>
#include <stdio.h>
#include <cstring>
#include <stack>
#include <math.h>
using namespace std;
typedef double ElemType;
const int MaxSize = 100 ;
const int inf = 0x3f3f3f3f ;
void trans( char * exp , char postexp[ ] ) ;
double compvalue( char * postexp) ;
void filter( char * dest, char * src, char ch)
{
int cur = 0 ;
int i = 0 ;
while ( src[ i++ ] ! = '\0 ' )
{
if ( src[ i - 1 ] == ch) continue ;
dest[ cur++ ] = src[ i - 1 ] ;
}
dest[ cur] = '\0 ' ;
}
int main( void )
{
char exp [ MaxSize] ;
char postexp[ MaxSize] ;
char postexp1[ MaxSize] ;
cout << "enter the infix expression." << endl;
scanf ( "%[^\n ]" , exp ) ;
//strcpy(exp, "(6 + 2) * 5 - 8 / 4");
filter( exp , exp , ' ' ) ;
printf ( "the original infix expression is\n %s\n " , exp ) ;
trans( exp , postexp) ;
filter( postexp1, postexp, '#' ) ;
cout << "the expression in postfix notation is:" << endl << postexp1 << endl;
cout << "the value is:" << compvalue( postexp) << endl;
return 0 ;
}
void printstack( stack< char > Optr)
{
stack< char > temp;
printf ( "the stack is:" ) ;
if ( Optr.empty ( ) )
{
printf ( "empty\n " ) ;
return ;
}
while ( ! Optr.empty ( ) )
{
temp.push ( Optr.top ( ) ) ;
Optr.pop ( ) ;
}
while ( ! temp.empty ( ) )
{
char c = temp.top ( ) ;
temp.pop ( ) ;
printf ( "%c " , c) ;
Optr.push ( c) ;
}
printf ( "\n " ) ;
}
void trans( char * exp , char postexp[ ] )
{
stack< char > Optr;
int i = 0 ;
char e;
while ( * exp ! = '\0 ' )
{
switch ( * exp )
{
case '(' :
Optr.push ( * exp ) ;
printstack( Optr) ;
exp ++ ;
break ;
case ')' :
e = Optr.top ( ) ;
Optr.pop ( ) ;
printstack( Optr) ;
while ( e ! = '(' )
{
postexp[ i++ ] = e;
e = Optr.top ( ) ;
Optr.pop ( ) ;
printstack( Optr) ;
}
exp ++ ;
break ;
case '+' :
case '-' :
while ( ! Optr.empty ( ) )
{
if ( Optr.top ( ) ! = '(' )
{
e = Optr.top ( ) ;
postexp[ i++ ] = e;
Optr.pop ( ) ;
printstack( Optr) ;
}
else
break ;
}
Optr.push ( * exp ) ;
printstack( Optr) ;
exp ++ ;
break ;
case '*' :
case '/' :
case '%' :
case '^' :
while ( ! Optr.empty ( ) )
{
if ( Optr.top ( ) == '*' || Optr.top ( ) == '/' || Optr.top ( ) == '%' || Optr.top ( ) == '^' )
{
e = Optr.top ( ) ;
postexp[ i++ ] = e;
Optr.pop ( ) ;
printstack( Optr) ;
}
else
break ;
}
Optr.push ( * exp ) ;
printstack( Optr) ;
exp ++ ;
break ;
default :
while ( * exp >= '0' && * exp <= '9' )
{
postexp[ i++ ] = * exp ;
exp ++ ;
}
postexp[ i++ ] = '#' ;
}
}
while ( ! Optr.empty ( ) )
{
e = Optr.top ( ) ;
postexp[ i++ ] = e;
Optr.pop ( ) ;
printstack( Optr) ;
}
postexp[ i] = '\0 ' ;
}
double compvalue( char * postexp)
{
double d, a, b, c, e;
stack< double > Opnd;
while ( * postexp ! = '\0 ' )
{
switch ( * postexp)
{
case '+' :
b = Opnd.top ( ) ;
Opnd.pop ( ) ;
a = Opnd.top ( ) ;
Opnd.pop ( ) ;
c = a+ b;
Opnd.push ( c) ;
break ;
case '-' :
b = Opnd.top ( ) ;
Opnd.pop ( ) ;
a = Opnd.top ( ) ;
Opnd.pop ( ) ;
c = a- b;
Opnd.push ( c) ;
break ;
case '*' :
b = Opnd.top ( ) ;
Opnd.pop ( ) ;
a = Opnd.top ( ) ;
Opnd.pop ( ) ;
c = a* b;
Opnd.push ( c) ;
break ;
case '/' :
b = Opnd.top ( ) ;
Opnd.pop ( ) ;
a = Opnd.top ( ) ;
Opnd.pop ( ) ;
if ( b == 0 )
{
cout << "divide by zero!" << endl;
return inf;
}
else
{
c = a/ b;
Opnd.push ( c) ;
}
break ;
case '%' :
b = Opnd.top ( ) ;
Opnd.pop ( ) ;
a = Opnd.top ( ) ;
Opnd.pop ( ) ;
if ( b == 0 )
{
cout << "divide by zero!" << endl;
return inf;
}
else
{
c = ( int ) a% ( int ) b;
Opnd.push ( c) ;
}
break ;
case '^' :
b = Opnd.top ( ) ;
Opnd.pop ( ) ;
a = Opnd.top ( ) ;
Opnd.pop ( ) ;
c = pow ( a,b) ;
Opnd.push ( c) ;
break ;
default :
d = 0 ;
while ( * postexp >= '0' && * postexp <= '9' )
{
d = d* 10 +* postexp- '0' ;
postexp++ ;
}
Opnd.push ( d) ;
break ;
}
postexp++ ;
}
e = Opnd.top ( ) ;
Opnd.pop ( ) ;
return e;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPGNzdHJpbmc+CiNpbmNsdWRlIDxzdGFjaz4KI2luY2x1ZGUgPG1hdGguaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKdHlwZWRlZiBkb3VibGUgRWxlbVR5cGU7CmNvbnN0IGludCBNYXhTaXplID0gMTAwOwpjb25zdCBpbnQgaW5mID0gMHgzZjNmM2YzZjsKIAp2b2lkIHRyYW5zKGNoYXIgKmV4cCwgY2hhciBwb3N0ZXhwW10pOwpkb3VibGUgY29tcHZhbHVlKGNoYXIgKnBvc3RleHApOwogCnZvaWQgZmlsdGVyKGNoYXIgKiBkZXN0LCBjaGFyICogc3JjLCBjaGFyIGNoKQp7CiAgICBpbnQgY3VyID0gMDsKICAgIGludCBpID0gMDsgCiAgICB3aGlsZSAoc3JjW2krK10gIT0gJ1wwJykKICAgIHsKICAgIAlpZiAoc3JjW2kgLSAxXSA9PSBjaCkgY29udGludWU7CiAgICAJZGVzdFtjdXIrK10gPSBzcmNbaSAtIDFdOwogICAgfQogICAgZGVzdFtjdXJdID0gJ1wwJzsKfQoKaW50IG1haW4odm9pZCkKewogICAgY2hhciBleHBbTWF4U2l6ZV07CiAgICBjaGFyIHBvc3RleHBbTWF4U2l6ZV07CgljaGFyIHBvc3RleHAxW01heFNpemVdOwogICAgY291dCA8PCAiZW50ZXIgdGhlIGluZml4IGV4cHJlc3Npb24uIiA8PCBlbmRsOwoJCiAgICBzY2FuZigiJVteXG5dIiwgZXhwKTsKCS8vc3RyY3B5KGV4cCwgIig2ICsgMikgKiA1IC0gOCAvIDQiKTsKCQoJZmlsdGVyKGV4cCwgZXhwLCAnICcpOwogICAgcHJpbnRmKCJ0aGUgb3JpZ2luYWwgaW5maXggZXhwcmVzc2lvbiBpc1xuJXNcbiIsIGV4cCk7CiAgICB0cmFucyhleHAsIHBvc3RleHApOwoJZmlsdGVyKHBvc3RleHAxLCBwb3N0ZXhwLCAnIycpOwogICAgY291dCA8PCAidGhlIGV4cHJlc3Npb24gaW4gcG9zdGZpeCBub3RhdGlvbiBpczoiIDw8IGVuZGwgPDwgcG9zdGV4cDEgPDwgZW5kbDsKICAgIGNvdXQgPDwgInRoZSB2YWx1ZSBpczoiIDw8IGNvbXB2YWx1ZShwb3N0ZXhwKSA8PCBlbmRsOwogICAgCiAgICAKICAgIHJldHVybiAwOwp9Cgp2b2lkIHByaW50c3RhY2soc3RhY2s8Y2hhcj4gT3B0cikKewoJc3RhY2s8Y2hhcj4gdGVtcDsKCXByaW50ZigidGhlIHN0YWNrIGlzOiIpOwoJaWYgKE9wdHIuZW1wdHkoKSkKCXsKCQlwcmludGYoImVtcHR5XG4iKTsKCQlyZXR1cm47Cgl9Cgl3aGlsZSAoIU9wdHIuZW1wdHkoKSkKCXsKCQl0ZW1wLnB1c2goT3B0ci50b3AoKSk7CgkJT3B0ci5wb3AoKTsKCX0KCgl3aGlsZSAoIXRlbXAuZW1wdHkoKSkKCXsKCQljaGFyIGMgPSB0ZW1wLnRvcCgpOwoJCXRlbXAucG9wKCk7CgkJcHJpbnRmKCIlYyAiLCBjKTsKCQlPcHRyLnB1c2goYyk7Cgl9CglwcmludGYoIlxuIik7Cn0KCnZvaWQgdHJhbnMoY2hhciAqZXhwLCBjaGFyIHBvc3RleHBbXSkKewogICAgc3RhY2s8Y2hhcj4gT3B0cjsKICAgIGludCBpID0gMDsKICAgIGNoYXIgZTsKICAgIHdoaWxlICgqZXhwICE9ICdcMCcpCiAgICB7CiAgICAgICAgc3dpdGNoICgqZXhwKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAnKCc6CiAgICAgICAgICAgICAgICBPcHRyLnB1c2goKmV4cCk7CgkJCQlwcmludHN0YWNrKE9wdHIpOwogICAgICAgICAgICAgICAgZXhwKys7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnKSc6CiAgICAgICAgICAgICAgICBlID0gT3B0ci50b3AoKTsKICAgICAgICAgICAgICAgIE9wdHIucG9wKCk7CgkJCQlwcmludHN0YWNrKE9wdHIpOwogICAgICAgICAgICAgICAgd2hpbGUgKGUgIT0gJygnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHBvc3RleHBbaSsrXSA9IGU7CiAgICAgICAgICAgICAgICAgICAgZSA9IE9wdHIudG9wKCk7CiAgICAgICAgICAgICAgICAgICAgT3B0ci5wb3AoKTsKCQkJCQlwcmludHN0YWNrKE9wdHIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZXhwKys7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnKyc6CiAgICAgICAgICAgIGNhc2UgJy0nOgogICAgICAgICAgICAgICAgd2hpbGUgKCFPcHRyLmVtcHR5KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKE9wdHIudG9wKCkgIT0gJygnKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZSA9IE9wdHIudG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RleHBbaSsrXSA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIE9wdHIucG9wKCk7CgkJCQkJCXByaW50c3RhY2soT3B0cik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBPcHRyLnB1c2goKmV4cCk7CgkJCQlwcmludHN0YWNrKE9wdHIpOwogICAgICAgICAgICAgICAgZXhwKys7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnKic6CiAgICAgICAgICAgIGNhc2UgJy8nOgoJCQljYXNlICclJzoKCQkJY2FzZSAnXic6CiAgICAgICAgICAgICAgICB3aGlsZSAoIU9wdHIuZW1wdHkoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoT3B0ci50b3AoKSA9PSAnKicgfHwgT3B0ci50b3AoKSA9PSAnLycgfHwgT3B0ci50b3AoKSA9PSAnJScgfHwgT3B0ci50b3AoKSA9PSAnXicpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBlID0gT3B0ci50b3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdGV4cFtpKytdID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgT3B0ci5wb3AoKTsKCQkJCQkJcHJpbnRzdGFjayhPcHRyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIE9wdHIucHVzaCgqZXhwKTsKCQkJCXByaW50c3RhY2soT3B0cik7CiAgICAgICAgICAgICAgICBleHArKzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgd2hpbGUgKCpleHAgPj0gJzAnICYmICpleHAgPD0gJzknKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHBvc3RleHBbaSsrXSA9ICpleHA7CiAgICAgICAgICAgICAgICAgICAgZXhwKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwb3N0ZXhwW2krK10gPSAnIyc7CiAgICAgICAgfQogICAgfQogICAgd2hpbGUgKCFPcHRyLmVtcHR5KCkpCiAgICB7CiAgICAgICAgZSA9IE9wdHIudG9wKCk7CiAgICAgICAgcG9zdGV4cFtpKytdID0gZTsKICAgICAgICBPcHRyLnBvcCgpOwoJCXByaW50c3RhY2soT3B0cik7CiAgICB9CiAgICBwb3N0ZXhwW2ldID0gJ1wwJzsKfQogCmRvdWJsZSBjb21wdmFsdWUoY2hhciAqcG9zdGV4cCkKewogICAgZG91YmxlIGQsIGEsIGIsIGMsIGU7CiAgICBzdGFjazxkb3VibGU+IE9wbmQ7CiAgICB3aGlsZSAoKnBvc3RleHAgIT0gJ1wwJykKICAgIHsKICAgICAgICBzd2l0Y2ggKCpwb3N0ZXhwKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAnKyc6CiAgICAgICAgICAgICAgICBiID0gT3BuZC50b3AoKTsKICAgICAgICAgICAgICAgIE9wbmQucG9wKCk7CiAgICAgICAgICAgICAgICBhID0gT3BuZC50b3AoKTsKICAgICAgICAgICAgICAgIE9wbmQucG9wKCk7CiAgICAgICAgICAgICAgICBjID0gYStiOwogICAgICAgICAgICAgICAgT3BuZC5wdXNoKGMpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJy0nOgogICAgICAgICAgICAgICAgYiA9IE9wbmQudG9wKCk7CiAgICAgICAgICAgICAgICBPcG5kLnBvcCgpOwogICAgICAgICAgICAgICAgYSA9IE9wbmQudG9wKCk7CiAgICAgICAgICAgICAgICBPcG5kLnBvcCgpOwogICAgICAgICAgICAgICAgYyA9IGEtYjsKICAgICAgICAgICAgICAgIE9wbmQucHVzaChjKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICcqJzoKICAgICAgICAgICAgICAgIGIgPSBPcG5kLnRvcCgpOwogICAgICAgICAgICAgICAgT3BuZC5wb3AoKTsKICAgICAgICAgICAgICAgIGEgPSBPcG5kLnRvcCgpOwogICAgICAgICAgICAgICAgT3BuZC5wb3AoKTsKICAgICAgICAgICAgICAgIGMgPSBhKmI7CiAgICAgICAgICAgICAgICBPcG5kLnB1c2goYyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnLyc6CiAgICAgICAgICAgICAgICBiID0gT3BuZC50b3AoKTsKICAgICAgICAgICAgICAgIE9wbmQucG9wKCk7CiAgICAgICAgICAgICAgICBhID0gT3BuZC50b3AoKTsKICAgICAgICAgICAgICAgIE9wbmQucG9wKCk7CiAgICAgICAgICAgICAgICBpZiAoYiA9PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvdXQgPDwgImRpdmlkZSBieSB6ZXJvISIgPDwgZW5kbDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5mOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewoJCQkJCWMgPSBhL2I7CiAgICAgICAgICAgICAgICAgICAgT3BuZC5wdXNoKGMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CgkJCWNhc2UgJyUnOgogICAgICAgICAgICAgICAgYiA9IE9wbmQudG9wKCk7CiAgICAgICAgICAgICAgICBPcG5kLnBvcCgpOwogICAgICAgICAgICAgICAgYSA9IE9wbmQudG9wKCk7CiAgICAgICAgICAgICAgICBPcG5kLnBvcCgpOwogICAgICAgICAgICAgICAgaWYgKGIgPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb3V0IDw8ICJkaXZpZGUgYnkgemVybyEiIDw8IGVuZGw7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjID0gKGludClhJShpbnQpYjsKICAgICAgICAgICAgICAgICAgICBPcG5kLnB1c2goYyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKCQkJY2FzZSAnXic6CiAgICAgICAgICAgICAgICBiID0gT3BuZC50b3AoKTsKICAgICAgICAgICAgICAgIE9wbmQucG9wKCk7CiAgICAgICAgICAgICAgICBhID0gT3BuZC50b3AoKTsKICAgICAgICAgICAgICAgIE9wbmQucG9wKCk7CiAgICAgICAgICAgICAgICBjID0gcG93KGEsYik7CiAgICAgICAgICAgICAgICBPcG5kLnB1c2goYyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGQgPSAwOwogICAgICAgICAgICAgICAgd2hpbGUgKCpwb3N0ZXhwID49ICcwJyAmJiAqcG9zdGV4cCA8PSAnOScpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZCA9IGQqMTArKnBvc3RleHAtJzAnOwogICAgICAgICAgICAgICAgICAgIHBvc3RleHArKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIE9wbmQucHVzaChkKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBwb3N0ZXhwKys7CiAgICB9CiAgICBlID0gT3BuZC50b3AoKTsKICAgIE9wbmQucG9wKCk7CiAgICByZXR1cm4gZTsKfQ==