习题6-1(error)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
/* 【平衡的括号】(UVa 673) //error的代码
输入一个包含“( )”和“[ ]”的括号序列,判断是否合法。
具体规则如下:1.空串合法。2.如果A和B都合法,则AB合法。
3.如果A合法则(A)和[A]都合法。 */
/*【分析】遍历字符串,同时用stack栈维护遍历过却没配对的括号
(1)左括号入栈 (2)右括号寻找匹配,退出或一起出栈 {后进先出}
(3)遍历完,栈不为空,则退出,false。 */
bool okk(const char* s) {
int len=strlen(s);
stack<char> st;
for(int i=0;i<len;i++){
char c=s[i];
if(c=='('||c=='[') st.push(c);
else{
assert(c==')'||c==']'); //assert作用是如果条件错误,就终止程序执行
if(st.empty()) return false; //不知道为什么这里的判断不能执行...
char t=st.top();
if(c==')'){
if(t=='(') st.pop();
else break;
}
if(c==']'){
if(t=='[') st.pop();
else break;
}
}
}
return st.empty(); //空 才能返回true
}
int main(){
int n; char ss[256]; cin>>n;
while(n--){
gets(ss);
if(okk(ss)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
习题6-2
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
/* 【S树】(UVa 712)
给出一棵满二叉树,每一层代表一个01变量,取0时往左走,取1时往右走。
给出所有叶子的值以及一些变量xi的取值,求每个查询到达的0叶子的值。*/
/* 【分析】观察发现,每遍历一个输入的字符(xi)后,就沿着树下降一层。
目标叶子所在的区间减小一半,处理完所有的xi后,刚好到达叶子。
先将每个叶节点的值记录在a[1..256]数组中,设标记变量L=1 。
当读到0时L=L*2;当读到1时L=L*2+1;由于是查询叶节点的值,要将L减去2^n-1 。
即L=L-2^n+1。注意:1、注意输入 2、将每树查询到的值用b[1..20000]储存后统一输出。 */
int n,m;
char termi[200];
vector<int> order;
void Calc(){
char temp[10],vva[200]; //xi字符串组,vva结点价值字符串组
int val;