zoukankan      html  css  js  c++  java
  • 利用栈解决一些基本问题

    题目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
    ****************************************************************/
  • 相关阅读:
    our毕业短片
    Android Memory Management, OutOfMemoryError
    android autoswitched ImageSwitcher
    Storage size of Bitmap
    Frequentlyused URI of Intent
    小知识: 软件版本号讲解: 什么是Alpha, Beta, RC
    JSF框架中使用的设计模式介绍
    Unicode编码表/00000FFF
    Spring事务的传播行为和隔离级别
    领略Spring 3.x 时代的Spring MVC
  • 原文地址:https://www.cnblogs.com/Murcielago/p/3859391.html
Copyright © 2011-2022 走看看