比如,類似這樣的運算式,
8 +(7 * (6 + 2 * (3 + 4)- 5)- 2) * 9
怎么決議呢?
謝謝
uj5u.com熱心網友回復:
這個比較復雜,你可以網上找找運算式相關的東西,網上有個開源的,不錯的,叫MTParseruj5u.com熱心網友回復:
用C/C++實作一個科學計算器uj5u.com熱心網友回復:
先乘除后加減,先算括號內的;
純數學的
uj5u.com熱心網友回復:
用遞回函式試試,碰到左括號就遞回解括號里的公式8 +(7 * (6 + 2 * (3 + 4)- 5)- 2) * 9
7 * (6 + 2 * (3 + 4)- 5)- 2
6 + 2 * (3 + 4)- 5
3 + 4
uj5u.com熱心網友回復:
把我之前抄的代碼貼一下看看
TCHAR *
GetExpressionValue( TCHAR *expression, __int64 *value )
{
//撰寫代碼對算術運算式求值的經典方法由 Donald Knuth 描述于 1962 年。
//
//Knuth 將此概括為三個步驟:
//
//1.對中綴運算式進行語法分析
//2.中綴運算式到后綴運算式的轉換
//3.對后綴運算式求值
TCHAR result[ 0x400 ] = _T( "" );
TCHAR stack[ 0x400 ] = _T( "" );
int top = -1;
//TCHAR end[ 30 ] = _T( ";,[]" );
//int i;
//int len;
TCHAR *p = expression;
int isfirst = 1;
//len = ( int )_tcslen( end );
TCHAR t[ 256 ] = _T( "" );
int current_len;
//中綴運算式到后綴運算式的轉換
//
//
//要把運算式從中綴運算式的形式轉換成用后綴表示法表示的等價運算式,必須了解運算子的優先級和結合性。
//優先級或者說運算子的強度決定求值順序;優先級高的運算子比優先級低的運算子先求值。
//如果所有運算子優先級一樣,那么求值順序就取決于它們的結合性。
//運算子的結合性定義了相同優先級運算子組合的順序(從右至左或從左至右)。
//
//轉換程序包括用下面的演算法讀入中綴運算式的運算元、運算子和括號:
//
//1.初始化一個空堆疊,將結果字串變數置空。
//2.從左到右讀入中綴運算式,每次一個字符。
//3.如果字符是運算元,將它添加到結果字串。
//4.如果字符是個運算子,彈出(pop)運算子,直至遇見開括號(opening parenthesis)、
// 優先級較低的運算子或者同一優先級的右結合符號。
// 把這個運算子壓入(push)堆疊。
//5.如果字符是個開括號,把它壓入堆疊。
//6.如果字符是個閉括號(closing parenthesis),在遇見開括號前,彈出所有運算子,然后把它們添加到結果字串。
//7.如果到達輸入字串的末尾,彈出所有運算子并添加到結果字串。
//
do
{
// gettoken( p, t, ¤t_len );
// for( i = 0; i < len; i++ )
// {
// if( t[ 0 ] == end[ i ]
// ||
// !t[ 0 ]
// )
// {
// goto EXPRESSION_BREAK;
// }
// }
p = gettoken( p, t, ¤t_len );
if( 0 == t[ 0 ] )
{
break;
}
if( isdec_t( t ) )
{
_tcscat( result, t );
_tcscat( result, g____newspace );
isfirst = 0;
}
else if( is0x_t( t ) )
{
// 轉成10進制,再進行求值
int len = ( int )_tcslen( t );
__int64 k = 0;
int i;
for( i = 2; i < len; i++ )
{
k <<= 4;
if( t[ i ] >= '0' && t[ i ] <= '9' )
{
k |= t[ i ] - '0';
}
else if( t[ i ] >= 'a' && t[ i ] <= 'f' )
{
k |= t[ i ] - 'a' + 10;
}
else if( t[ i ] >= 'A' && t[ i ] <= 'F' )
{
k |= t[ i ] - 'A' + 10;
}
}
TCHAR v[ 0x20 ];
_stprintf( v, _T( "%I64u" ), k );
_tcscat( result, v );
_tcscat( result, g____newspace );
isfirst = 0;
}
else if( !_tcscmp( t, _T( "+" ) ) || !_tcscmp( t, _T( "-" ) ) )
{
if( isfirst )
{
_tcscat( result, _T( "0" ) );
_tcscat( result, g____newspace );
isfirst = 0;
}
while( -1 != top
&&
LEFT_XIAOKUOHAO != stack[ top ]
)
{
result[ _tcslen( result ) ] = stack[ top ];
_tcscat( result, g____newspace );
top--;
}
top++;
stack[ top ] = t[ 0 ];
isfirst = 0;
}
else if( !_tcscmp( t, _T( "*" ) ) || !_tcscmp( t, _T( "/" ) ) )
{
while( '*' == stack[ top ]
||
XIEGANG == stack[ top ]
)
{
result[ _tcslen( result ) ] = stack[ top ];
_tcscat( result, g____newspace );
top--;
}
top++;
stack[ top ] = t[ 0 ];
isfirst = 0;
}
else if( !_tcscmp( t, _T( "(" ) ) )
{
top++;
stack[ top ] = t[ 0 ];
isfirst = 1;
}
else if( !_tcscmp( t, _T( ")" ) ) )
{
while( LEFT_XIAOKUOHAO != stack[ top ] )
{
result[ _tcslen( result ) ] = stack[ top ];
_tcscat( result, g____newspace );
top--;
}
top--;
isfirst = 0;
}
else
{
INIT;
mul( 20 );
if( IsChinese() )
{
RED( _T( "運算式錯誤 " ) );
}
else
{
RED( _T( "Expression Error" ) );
}
BLUE( p );
SHOW;
//printf( "運算式錯誤 %s", p );
return expression;
}
} while ( 1 );
//EXPRESSION_BREAK:
while( -1 != top )
{
result[ _tcslen( result ) ] = stack[ top ];
_tcscat( result, g____newspace );
top--;
}
//后綴運算式求值
//
//對后綴運算式求值比直接對中綴運算式求值簡單。
//在后綴運算式中,不需要括號,而且運算子的優先級也不再起作用了。
//您可以用如下演算法對后綴運算式求值:
//
//1.初始化一個空堆疊
//2.從左到右讀入后綴運算式
//3.如果字符是一個運算元,把它壓入堆疊。
//4.如果字符是個運算子,彈出兩個運算元,執行恰當操作,然后把結果壓入堆疊。如果您不能夠彈出兩個運算元,后綴運算式的語法就不正確。
//5.到后綴運算式末尾,從堆疊中彈出結果。若后綴運算式格式正確,那么堆疊應該為空。
double data[ 64 ];
TCHAR *q = result;
memset( data, 0, sizeof( data ) );
top = -1;
do
{
q = gettoken( q, t, ¤t_len );
if( !t[ 0 ] )
{
break;
}
if( !_tcscmp( t, _T( "+" ) ) )
{
data[ top - 1 ] += data[ top ];
top--;
}
else if( !_tcscmp( t, _T( "-" ) ) )
{
data[ top - 1 ] -= data[ top ];
top--;
}
else if( !_tcscmp( t, _T( "*" ) ) )
{
data[ top - 1 ] *= data[ top ];
top--;
}
else if( !_tcscmp( t, _T( "/" ) ) )
{
if( !data[ top ] )
{
*value = 0xffffffffffffffff;
return p;
}
else
{
data[ top - 1 ] /= data[ top ];
top--;
}
}
else
{
top++;
if( isdec_t( t ) )
{
data[ top ] = ( double )_wtoi64( t );
#if 0
size_t i;
size_t l = _tcslen( t );
double d = 0.0;
for( i = 0; i < l; i++ )
{
d *= 10.0;
d += ( t[ i ] - 0x30 );
}
data[ top ] = d;
#endif
}
else
{
INIT;
mul( 20 );
if( IsChinese() )
{
RED( _T( "運算式錯誤 " ) );
}
else
{
RED( _T( "Expression Error" ) );
}
BLUE( p );
SHOW;
return expression;
}
}
} while( 1 );
*value = ( __int64 )data[ top ];
return p;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/7404.html
標籤:基礎類
下一篇:如何獲得WMP控制元件視窗指標
