码迷,mamicode.com
首页 > 其他好文 > 详细

栈——括号匹配

时间:2015-10-02 18:46:54      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:   括号匹配   

Scaena Felix

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 492    Accepted Submission(s): 214


Problem Description

Given a parentheses sequence consist of ‘(‘ and ‘)‘, a modify can filp a parentheses, changing ‘(‘ to ‘)‘ or ‘)‘ to ‘(‘.

If we want every not empty <b>substring</b> of this parentheses sequence not to be "paren-matching", how many times at least to modify this parentheses sequence?

For example, "()","(())","()()" are "paren-matching" strings, but "((", ")(", "((()" are not.

 


Input

The first line of the input is a integer T, meaning that there are T test cases.

Every test cases contains a parentheses sequence S only consists of ‘(‘ and ‘)‘.

1|S|1,000.

 


Output

For every test case output the least number of modification.

 


Sample Input

3
()
((((
(())

 


Sample Output

1
0
2

题目最终就是要要求统计的匹配括号对,实际就是栈的应用。

源码:


#include<iostream>

#include<cstdio>

#include<cstdlib>

#include<string>

#include<stack>

#include<vector>


using namespace std;


#define MAX 1009


template <class Type>


class Stack {

public:

Stack(int MaxStackSize = MAX);

bool IsFull();

bool IsEmpty();

void Push(const Type x);

Type Pop();

private:

int top;

Type *stack;

int MaxSize;

};


template<class Type>

Stack<Type>::Stack(int MaxStackSize) :MaxSize(MaxStackSize)

{

stack = new Type[MaxSize];

top = -1;

}


template<class Type>

inline bool Stack<Type>::IsFull()

{

if (top == MaxSize - 1)

return true;

else

return false;

}


template<class Type>

inline bool Stack<Type>::IsEmpty()

{

if (top == -1)

return true;

else

return false;

}


template<class Type>


void Stack<Type>::Push(const Type x)

{

if (IsFull())

;

else

stack[++top] = x;

}


template<class Type>


Type Stack<Type>::Pop()

{

if (IsEmpty())

{

return 0;

}

else

{

Type x = stack[top--];

return x;

}

return 0;

}


template<class Type>

int GetNum(const Type *S,int n)

{

int count = 0;

Type x = ‘ ‘;

Stack<Type> ST;

ST.Push(*S++);

for (int i = 1; i < n; i++)

{

x = ‘ ‘;

if (!ST.IsEmpty())

{

x = ST.Pop();

}

if (x == ‘(‘&&*S == ‘)‘)

{

count++;

*S++;

}

else

{

if (x!=‘ ‘)

ST.Push(x);

ST.Push(*S++);

}

}

return count;

}


int main()

{

int T = 0;

string S;

while (cin >> T) {

for (int i = T; i >= 1; i--)

{

cin >> S;

cout << GetNum(S.c_str(),S.size()) << endl;

}

}

return 0;

}


本文出自 “风雪夜之星” 博客,请务必保留此出处http://592669550.blog.51cto.com/5487419/1699918

栈——括号匹配

标签:   括号匹配   

原文地址:http://592669550.blog.51cto.com/5487419/1699918

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!