这里是引用有效括号字符串为空 ("")、"(" + A + “)” 或 A + B,其中 A 和 B 都是有效的括号字符串,+ 代表字符串的连接。例如,"","()","(())()" 和 “(()(()))” 都是有效的括号字符串。
如果有效字符串 S 非空,且不存在将其拆分为 S = A+B 的方法,我们称其为原语(primitive),其中 A 和 B 都是非空有效括号字符串。
给出一个非空有效字符串 S,考虑将其进行原语化分解,使得:S = P_1 + P_2 + … + P_k,其中 P_i 是有效括号字符串原语。
对 S 进行原语化分解,删除分解中每个原语字符串的最外层括号,返回 S 。
/**
* @param {string} S
* @return {string}
*/
var removeOuterParentheses = function(S) {
let count=0;
let stack=[];
for(let i=0;i<S.length;i++){
if(S[i]=='('){
count++;
if(count>=2){
stack.push(S[i]);
}
}else if(S[i]==')'){
count--;
if(count>0){
stack.push(S[i]);
}
}
}
return stack.join('');
};
**分析:**栈:先进后出,最后进入的数据在栈顶。关于这道题,可将括号存入数组中,根据计数来进行去除最外层括号。
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
var CQueue = function() {
this.inStack = [];
this.outStack = [];
};
//队列:先进先出
/**
* @param {number} value
* @return {void}
*/
//看他调用的方法将他写在原型中
CQueue.prototype.appendTail = function(value) {
this.inStack.push(value);//在队列中添加元素,直接添加到队尾就可
};
/**
* @return {number}
*/
//队列删除:因为数据结构是栈,栈是后进先出,所以说想要实现队列,需要先把栈的顺序颠倒,然后再pop
CQueue.prototype.deleteHead = function() {
const { inStack, outStack } = this;
if (outStack.length) {
return outStack.pop();
} else {
while (inStack.length) {
outStack.push(inStack.pop());//翻转数组 想要删除队头,就需要把栈底元素放到栈顶 所以反转数组即可,而栈弹出来的顺序放入输出栈中就会 反转
}
return outStack.pop() || -1;
}
};
/**
* Your CQueue object will be instantiated and called as such:
* var obj = new CQueue()
* obj.appendTail(value)
* var param_2 = obj.deleteHead()
*/