、C ++のを使用して電卓を書くようにしてください加算、減算とブラケットをサポートしています。
私は、ブラケット、支持ブラケット、その後、変更されたバージョンをサポートしていないシンプルを書くために、段階的に行われていました。
A.だけ加算、減算をサポート
2つのスタック(STLスタックをお勧めしませんSTLが遅すぎると感じ、ので、スタックを書くのは難しいことではありません)、スタック・ストレージ・シンボルと手書き、スタック領域は、番号(符号なし)に読み込まれました。
過剰発現スイープ最初の数が正の数であれば+がログインすると、2つのスタック(に格納された配列内の記号と数字は、スタックへの最初のシンボルに注意し、それが負の場合、プッシュ - 数、ストレージスタック数)は正の数に格納されます。スタック・ストレージ・シンボルは+を格納するために必要がある - ライン上、または* \数、スタックの最上位への直接乗算と除算の数を、読めばあなたは、乗算や除算の優先順位を確保することができるように。
Saowan後のライン上のスタックの上にそれらを注文します。
#include <cstdioを> する#include <CStringの> 使用して 名前空間STD; CONST INT MAXN = 10000 ; INT N-; CHAR CH [+ MAXN 5 ]; int型 read_pos; // 読む()最後の文字ファッショナブル+ +1の位置読み出し インラインINTを(読むint型 S){ // 番号の先頭に戻るのCH [S]を INT ANS = 0 ; のために((CH [S]> = ' 0 ' && CH [S] <= ' 9 '); S ++ ) ANS ANS * = 10CH + [S] - ' 0 ' ; read_pos =のS; 戻りANSを; } int型の解決(int型 L、INT R){ // RのLの値に発現 INTスタック[ 2 ] [+ MAXN 5。 ]、LEN = 0 ; // 手書きスタック IF(CH [L] =!' - ' ) スタック[ 0 ] [LEN ++] = 1。 、スタック[ 1。 ] [LEN] = リード(L); 他のスタック[ 0 ] [++ LEN] = - 1、スタック[1 ] [LEN =読み取る(L + 1 )。 L = read_pos。 int型の温度; 一方、(L <= R){ 場合(CH [L] == ' + ' ) スタックは[ 0 ] = [++でlen] 1 [スタック1 ] [lenが(L +読み取り= 1 )。 そう であれば(CH [L] == ' - ' ) [スタック0 ] [++でlen] = - 1、[スタック1 ] [LEN]が読み出され(L + = 1 )。 それ以外の 場合は(CH [L] ==' * ' ) TEMP =(L +読み取る1スタック)[ 1 ] [LEN] * = TEMP。 他 TEMP =読み取る(L + 1)、[スタック1 ] [LEN] / = TEMPと、 L = read_pos。 } int型の結果= 0 。 以下のために(int型 i = 1 ; iは= LEN <; iは++) // 处理掉栈中的数 結果+ =(スタック[ 0 ] [I] *スタック[ 1 ] [I])。 戻り値の結果; } int型{メイン() // freopenは( "test2.in"、 "R"、STDIN)。 scanf関数(" %sの" 、CH)。 INT TT = STRLEN(CH)。 printf(" %dの"解決(0、TT- 1 ))。 リターン 0 ; }
II。サポートブラケット
そこに私は、各プリ位置にブラケットを付着させたときに多くの方法が、シミュレートべきであり、そしてライン再帰的計算上のブラケット(ブラケット場合ビューの数)。
書式#include <cstdioを> する#include <CStringの> 使用して 名前空間はstdを、 const int型 MAXN = 10000 ; int型のn; チャー CH [MAXN + 5 ]。 INT [MAXN +に5 ]。 INT QUE [MAXN + 5 ]、サイズ。 int型read_pos; int型の読み取り(int型秒)。 INT(解決int型 L、int型R){ int型のスタック[ 2 ] [MAXN + 5でlen] = 0 ; もし(CH [L]!=' - ' ) スタック[ 0 ] [++ LEN = 1、[スタック1 ] [LEN = )読み出す(リットル; 他のスタック[ 0 ] [++ LEN] = - 1、スタック[ 1 ]読み取り= LEN(L + 1 )。 L = read_pos。 int型の温度; 一方、(L <= R){ 場合(CH [L] == ' + ' ) スタックは[ 0 ] = [++でlen] 1 [スタック1 ] [lenが(L +読み取り= 1 )。 それ以外の 場合(CH [L] == ' - ' ) スタック[ 0 ] [++ LEN] = - 1、スタック[ 1 ]読み取り= LEN(L + 1 )。 他の 場合は(CH [L] == ' * ' ) TEMP =読み取る(L + 1)、スタック[ 1 ] [LEN] * = TEMP。 他 TEMP =読み取る(L + 1)、[スタック1 ] [LEN] / = TEMPと、 L = read_pos。 } int型の結果= 0 。 以下のための(int型i = 1 ; iがLEN = <; I ++の) 結果 + =(スタック[ 0 ] [I] *スタック[ 1 ] [I])。 戻り値の結果; } int型のmain(){ // freopenは( "test2.in"、 "R"、STDIN)。 scanf関数(" %sの" 、CH)。 INT TT = STRLEN(CH)。 以下のために(int型 I = 0 ; iがTTを<; I ++の) 場合(CH [I] == ' (' ) QUE [ ++サイズ] = I; そう なら(CH [I] == ')' ) に[QUE [サイズ] = I、、サイズ= 1 。 printf(" %dの"解決(0、TT- 1 ))。 リターン 0 ; } インラインint型リード(int型の){ int型 ANS = 0、F = 1 。 もし(CH [S] == ' (' ){ ANS = S +(解決1 [S]に、 - 1 ); read_posの = [S] +に1 、 リターンANS; } そう なら(CH [S] == ' - ')、F = - 1、S + = 1 ; 用((CH [S]> = ' 0 ' && CH [S] <= ' 9 '); S ++ ) ANS = ANS * 10 + CH [S] - ' 0 ' 。 read_pos =のS; 戻る ANS *のfは、 }