欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PTA-栈(括弧匹配)

程序员文章站 2022-05-17 23:49:43
#include using namespace std; #define STACK_INIT_SIZE 10000 #define STACKINCREMENT 10 #define TRUE 1 #define FALSE 0 #define OK 1 #defi ......
PTA-栈(括弧匹配)
#include<bits/stdc++.h>
using namespace std;


#define stack_init_size 10000
#define stackincrement 10
#define true        1
#define false       0
#define ok          1
#define error       0
#define infeasible -1
#define overflow   -2
using namespace std;
typedef char selemtype, status;
typedef struct
{
    selemtype *base;
    selemtype *top;
    int stacksize;
}sqstack;
status initstack(sqstack &s)
{
    s.base = (selemtype *)malloc(sizeof(selemtype)*stack_init_size);
    if (!s.base)
        exit(overflow);
    s.top = s.base;
    s.stacksize = stack_init_size;
    return ok;
}
status push(sqstack &s, selemtype e)
{
    if (s.top - s.base >= s.stacksize)
    {
        s.base = (selemtype*)malloc(sizeof(selemtype)*(s.stacksize + stackincrement));
        if (!s.base)
            exit(overflow);
        s.top = s.base + s.stacksize;
        s.stacksize += stackincrement;
    }
    *s.top++ = e;
    return ok;

}
status pop(sqstack &s)
{
    if (s.top == s.base)
        return error;
    s.top--;
    return ok;
}
status gettop(sqstack &s, selemtype &e)
{
    if (s.base == s.top)
        return error;
    e = *(s.top - 1);
    return ok;
}
status empty(sqstack s)
{
    if (s.top == s.base)
        return ok;
    else
        return error;
}


const int maxn = 1000 + 5;
char s[maxn];
bool find(sqstack &s, char ch)
{
    char tmp[maxn]; //初始化为“\n”;
    memset(tmp, '\n', sizeof(tmp)); //memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;
    int num = 0; 
    while (!empty)
    {
        selemtype e2;
        gettop(s, e2);
        if (e2 == ch)
        {
            pop(s);
            for (int i = num - 1; i >= 0; i--)
                push(s, tmp[i]);
            return true;
        }
        else
        {
            tmp[num++] = e2;
        }
        pop(s);
    }
    for (int i = num - 1; i >= 0; i--)
        push(s, tmp[i]);
    return false;
}
void judge(char ch)
{
    if (ch == '(')
        printf("(-?\n");
    else if (ch == '[')
        printf("[-?\n");
    else if (ch == '{')
        printf("{-?\n");
    else if (ch == '<')
        printf("/*-?\n");
}

void fun(sqstack &sta, char ch)
{
    int flag = 1;;
    if (!empty(s)
    {
        selemtype e;
        gettop(sta, e);
        if (e == '(')
            pop(sta);
        else if (flag)
        {
            printf("no\n");
            flag = 0;
            judge(e);
        }
    }
}


int main()
{
    sqstack sta;
    initstack(sta);
    int flag = 1;
    while (gets(s))
    {
        if (s[0] == '.') break;
        int len = strlen(s);
        for (int i = 0; i < len; i++)
        {
            if (s[i] == '(' || s[i] == '[' || s[i] == '{')
                push(sta, s[i]);
            else if (s[i] == '/'&&s[i + 1] == '*'&&i + 1 < len)
            {
                ++i;
                push(sta, '<');
            }

            else if (s[i] == ')')
            {

                if (!empty(sta)
                {
                    selemtype e;
                    gettop(sta, e);
                    if (e == '(')
                        pop(sta);
                    else if (flag)
                    {
                        printf("no\n");
                        flag = 0;
                        judge(e);
                    }
                }
                else if (flag)
                {
                    flag = 0;
                    printf("no\n");
                    printf("?-)\n");
                }


            }
            else if (s[i] == ']')
            {

                if (!empty(sta)
                {
                    selemtype e;
                    gettop(sta, e);
                    if (e == '[')
                        pop(sta);
                    else if (flag)
                    {
                        printf("no\n");
                        flag = 0;
                        judge(e);
                    }
                }
                else if (flag)
                {
                    flag = 0;
                    printf("no\n");
                    printf("?-]\n");
                }


            }
            else if (s[i] == '}')
            {

                if (!empty(sta)
                {
                    selemtype e;
                    gettop(sta, e);
                    if (e == '{')
                        pop(sta);
                    else if (flag)
                    {
                        printf("no\n");
                        flag = 0;
                        judge(e);
                    }
                }
                else if (flag)
                {
                    flag = 0;
                    printf("no\n");
                    printf("?-}\n");
                }


            }
            else if (s[i] == '*'&&s[i + 1] == '/'&&i + 1 < len)
            {
                ++i;
                if (!empty(sta)
                {
                    selemtype e;
                    gettop(sta, e);
                    if (e == '<')
                        pop(sta);
                    else if (flag)
                    {
                        printf("no\n");
                        flag = 0;
                        judge(e);
                    }
                }
                else if (flag)
                {
                    flag = 0;
                    printf("no\n");
                    printf("?-*/\n");
                }

            }
        }
    }
    if (flag)
    {
        if (!empty(sta)
            printf("yes\n");
        else
        {
            selemtype e;
            gettop(sta, e);
            printf("no\n");
            judge(e);
        }
    }
}
view code
7-2 符号配对 (20 分)

请编写程序检查c语言源程序中下列符号是否配对:/**/()[]{}

输入格式:

输入为一个c语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。

输出格式:

首先,如果所有符号配对正确,则在第一行中输出yes,否则输出no。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号;如果缺少右符号,则输出左符号-?

输入样例1:

void test()
{
    int i, a[10];
    for (i=0; i<10; i++) /*/
        a[i] = i;
}
.

输出样例1:

no
/*-?

输入样例2:

void test()
{
    int i, a[10];
    for (i=0; i<10; i++) /**/
        a[i] = i;
}]
.

输出样例2:

no
?-]

输入样例3:

void test()
{
    int i
    double a[10];
    for (i=0; i<10; i++) /**/
        a[i] = 0.1*i;
}
.

输出样例3:

yes