抛出问题:校验字符串中括号是否对应,并可以根据配置修改需要匹配的成对字符。
例:
()()(()) 输出:OK
()[]{}{([])} 输出: OK
((())] 输出:NO
对应则返回true,若不对应则返回false
C#代码如下(与java代码差距不大),使用栈(新进后出,和装羽毛球的盒子一样)这种方式来处理此种问题,代码简洁易懂不做过多陈述:
public class Question { // _dictionary以右括号为key, 左括号为值 private Dictionary<char, char> _dictionary = null; public Question() { //可对匹配字符串进行配置修改 _dictionary = new Dictionary<char, char> { { ')', '(' }, { '}', '{' }, { ']', '[' } }; } public bool IsMatch(string str) { Stack<char> sc = new Stack<char>(); for (int i = 0; i < str.Length; i++) { char ch = str[i]; if (_dictionary.ContainsValue(ch))// 如果是左括号,放入栈中 { //压入栈 sc.Push(ch); } else if (_dictionary.ContainsKey(ch)) // 如果是右括号 { if (sc.Count == 0) // 栈为空,栈头没有字符与右括号匹配 { return false; } // 栈不为空,栈头字符与右括号匹配 if (sc.Peek() == _dictionary[ch]) { //出栈 sc.Pop(); } else { return false; } } } return sc.Count == 0 ? true : false; } }接下来看一下栈的源码部分了解一下其实现原理:
private T[] _array; // Storage for stack elements private int _size; // Number of items in the stack. private int _version; // Used to keep enumerator in sync w/ collection.其实栈内就一个泛型的数组来存储我们压进去的值,只有通过_size来压入新的值或者取出存入的值
push:
// Pushes an item to the top of the stack. // /// <include file='doc\Stack.uex' path='docs/doc[@for="Stack.Push"]/*' /> public void Push(T item) { if (_size == _array.Length) { T[] newArray = new T[(_array.Length == 0) ? _defaultCapacity : 2*_array.Length]; Array.Copy(_array, 0, newArray, 0, _size); _array = newArray; } _array[_size++] = item; _version++; }因为数组在声明的时候必须限定大小,所以会有一个默认的大小,当新的值压入进来后会进行判断大小是否可存入数组,如果无法存储则会扩展数组后在将值存入。
pop:
// Pops an item from the top of the stack. If the stack is empty, Pop // throws an InvalidOperationException. /// <include file='doc\Stack.uex' path='docs/doc[@for="Stack.Pop"]/*' /> public T Pop() { if (_size == 0) ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EmptyStack); _version++; T item = _array[--_size]; _array[_size] = default(T); // Free memory quicker. return item; }出栈首先判断栈中是否存在数据。之后通过_size来控制出栈的值。
因为栈需要新进后出,所以不存在使用下标获取值或赋值的方式。
就我个人而言 Java的源码要比C#的源码看起来更整齐,更好理解。
记录生活点点滴滴。
版权声明:本文为博主原创文章,未经博主允许不得转载。