C ++シンプルな電卓

  、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は、
}

 

おすすめ

転載: www.cnblogs.com/awakening-orz/p/11265694.html