利用栈解决一些基本问题

题目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
****************************************************************/
原文地址:https://www.cnblogs.com/Murcielago/p/3859391.html