题目1153:括号匹配问题
- 题目描述:
-
在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$"标注,不能匹配的右括号用"?"标注.
- 输入:
-
输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100。
注意:cin.getline(str,100)最多只能输入99个字符!
- 输出:
-
对每组输出数据,输出两行,第一行包含原始输入字符,第二行由"$","?"和空格组成,"$"和"?"表示与之对应的左括号和右括号不能匹配。
- 样例输入:
-
)(rttyy())sss)(
- 样例输出:
-
)(rttyy())sss)( ? ?$
代码如下:#include <stdio.h> #include <stack> #include <string.h> using namespace std; int main(int argc, char* argv[]) { char str[101]; char ans[101]; stack<int> S; int len,i,j; while(scanf("%s",str)!=EOF){ len=strlen(str); for(i=0;i<=len-1;i++){ if(str[i]=='('){ S.push(i); ans[i]=' '; } else{ if(str[i]==')'){ if(!S.empty()){ S.pop(); ans[i]=' '; } else ans[i]='?'; } else{ ans[i]=' '; } } } while(!S.empty()){ int x=S.top(); ans[x]='; S.pop(); } for(j=0;j<=len-1;j++) printf("%c",str[j]); printf(" "); for(j=0;j<=len-1;j++) printf("%c",ans[j]); printf(" "); } return 0; } /************************************************************** Problem: 1153 User: lcyvino Language: C++ Result: Accepted Time:0 ms Memory:1052 kb ****************************************************************/
题目1108:堆栈的使用- 题目描述:
-
堆栈是一种基本的数据结构。堆栈具有两种基本操作方式,push 和 pop。Push一个值会将其压入栈顶,而 pop 则会将栈顶的值弹出。现在我们就来验证一下堆栈的使用。
- 输入:
-
对于每组测试数据,第一行是一个正整数 n,0<n<=10000(n=0 结束)。而后的 n 行,每行的第一个字符可能是'P’或者'O’或者'A’;如果是'P’,后面还会跟着一个整数,表示把这个数据压入堆栈;如果是'O’,表示将栈顶的值 pop 出来,如果堆栈中没有元素时,忽略本次操作;如果是'A’,表示询问当前栈顶的值,如果当时栈为空,则输出'E'。堆栈开始为空。
- 输出:
-
对于每组测试数据,根据其中的命令字符来处理堆栈;并对所有的'A’操作,输出当时栈顶的值,每个占据一行,如果当时栈为空,则输出'E’。当每组测试数据完成后,输出一个空行。
- 样例输入:
-
3 A P 5 A 4 P 3 P 6 O A 0
- 样例输出:
-
E 5 3
代码如下:#include <stdio.h> #include <stack> using namespace std; int main(int argc, char* argv[]) { int n; while(scanf("%d",&n)!=EOF&&n!=0){ char ch[10]; stack<int> S; for(int i=0;i<=n-1;i++){ scanf("%s",ch); if(ch[0]=='P'){ int x; scanf("%d",&x); S.push(x); } if(ch[0]=='O'){ if(!S.empty()){ S.pop(); } } if(ch[0]=='A'){ if(S.empty()){ printf("E "); } else{ int y=S.top(); printf("%d ",y); } } } printf(" "); } return 0; } /************************************************************** Problem: 1108 User: lcyvino Language: C++ Result: Accepted Time:20 ms Memory:1052 kb ****************************************************************/
注意 读的时候利用ch[10],取的时候利用ch[0],贴上之前错误的代码:
#include <stdio.h> #include <stack> using namespace std; int main(int argc, char* argv[]) { int n; while(scanf("%d",&n)!=EOF&&n!=0){ char ch; stack<int> S; for(int i=0;i<=n-1;i++){ scanf("%c",&ch); if(ch=='P'){ int x; scanf("%d",&x); S.push(x); } if(ch=='O'){ if(!S.empty()){ S.pop(); } } if(ch=='A'){ if(S.empty()){ printf("E "); } else{ int y=S.top(); printf("%d ",y); } } } printf(" "); } return 0; } /************************************************************** Problem: 1108 User: lcyvino Language: C++ Result: Wrong Answer ****************************************************************/