C++與演算法

解答 - 小呆的決心

說明

依序走一遍輸入字串

利用 stack 儲存每個 左括號( 的位置

每當遇到一個 右括號) 就消除 stack 中最後出現的 左括號(

 若是無法消除,則代表該 右括號) 是無法匹配的

若走完輸入字串後還有剩餘的 左括號( ,則這些左括號都是無法匹配的

code

#include<iostream>
using namespace std;

char in[1005], ans[1005];
int pos[1005], num, len;


int main()
{
    while( cin >> in )
    {
        //check ')' error
        len = strlen(in);
        num = 0;
        for( int i = 0 ; i < len ; i++ )
        {
            ans[i] = '-';
            if( in[i] == '(' )
            {
                pos[num] = i;
                num++;
            }
            else if( in[i] == ')' )
            {
                if( num > 0 )
                    num--;
                else
                    ans[i] = '^';
            }
        }

        //check '(' error
        for( int i = num-1 ; i >=0 ; i-- )
            ans[pos[i]] = '^';
        ans[len] = '\0';

        cout << in << endl << ans << endl;
    }
    return 0;
}