1、字符串和堆栈(java实现)编写一个程序,检查字符串是否包含正确嵌套和平衡的圆括号、方括号和花括号。

1. 字符串和堆栈
1.1【问题描述】
编写一个程序,检查字符串是否包含正确嵌套和平衡的圆括号、方括号和花括号。
1.2【基本要求】
运行程序时,输入一个包含圆括号、方括号和花括号的字符串,分析其中的圆括号、
方括号和花括号是否正确嵌套和平衡。如果字符串是平衡的,程序将不输出任何内容,
并以EXIT_SUCCESS状态退出。其他情况,将输出一条错误消息,并以失败状态退出。
在扫描字符串遇到(、[或{时,将该该括号入栈;遇到)、]或}时,将从栈中弹出顶
部括号,并检查它是否与字符串中遇到的右括号匹配;如果括号不匹配,或者栈为空,
程序将输出不匹配的括号和遇到的不匹配的括号的索引;如果扫描字符串结束时,栈不
为空,输出信息:open:对应右括号列表。如表1-1所示。
注意:可以忽略所有非括号字符。可以使用任何你认为方便的数据结构。最优算法
的时间复杂度是O(n),空间复杂度是O(n),其中n是输入字符串的长度。

 先放一个java的:


import java.util.Scanner;
import java.util.Stack;

public class demo {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入包含圆括号、方括号和花括号的字符串:");
        String s = scanner.nextLine();

        Stack stack = new Stack<>();        //定义一个栈
        int len = s.length();
        for (int i = 0; i < len; ++i) {        //遍历每一个字符
            char c = s.charAt(i);
            if (c == '(' || c == '[' || c == '{') {        //左括号符合题述,入栈
                stack.push(i);
            } else if (c == ')' || c == ']' || c == '}') {       // 右括号分多种情况
                if (stack.isEmpty()) {
                    System.out.printf("%d:%s%n", i, "无法匹配对应的左括号");
                    System.exit(1);
                }
                int j = stack.pop();
                char t = s.charAt(j);
                if (c == ')' && t != '(' || c == ']' && t != '[' || c == '}' && t != '{') {
                    System.out.printf("%d:%s%n", i, "无法匹配对应的左括号");
                    System.exit(1);
                }
            }
        }

        if (!stack.isEmpty()) {
            System.out.print("open:");
            while (!stack.isEmpty()) {
                int j = stack.pop();
                char c = s.charAt(j);
                System.out.printf("%c", c == '(' ? ')' : (c == '[' ? ']' : '}'));
            }
            System.out.println();
            System.exit(1);
        }

        System.out.println("输入的字符串是合法的!");
        System.exit(0);
    }
}

应评论放一个C语言实现的,后面两个用其他语言也更新了,仓促回来更新一下第一个(可能写的有点乱),想要怎么调整或者输出可以根据自己的喜好来。

//C语言实现:
#include 
#include 

#define MAX_STACK_SIZE 100

typedef struct {
    int top;
    char stack[MAX_STACK_SIZE];
} Stack;

void stack_init(Stack *s) {
    s->top = -1;
}

void push(Stack *s, char c) {
    if (s->top >= MAX_STACK_SIZE - 1) {
        printf("栈已满,无法入栈!\n");
        return;
    }
    s->stack[++(s->top)] = c;
}

char pop(Stack *s) {
    if (s->top == -1) {
        printf("栈为空!\n");
        return 0;
    }
    return s->stack[(s->top)--];
}

int is_left_bracket(char c) {
    if (c == '(' || c == '[' || c == '{')
        return 1;
    return 0;
}

int is_right_bracket(char c) {
    if (c == ')' || c == ']' || c == '}')
        return 1;
    return 0;
}

int is_match(char left, char right) {
    if (left == '(' && right == ')')
        return 1;
    else if (left == '[' && right == ']')
        return 1;
    else if (left == '{' && right == '}')
        return 1;
    else
        return 0;
}

void process_input(char *input) {
    Stack s;
    stack_init(&s);
    int i;
    for (i = 0; input[i] != '\0'; i++) {
        if (is_left_bracket(input[i]))
            push(&s, input[i]);
        else if (is_right_bracket(input[i])) {
            if (s.top == -1) {
                printf("%d:%c\n", i, input[i]);
                return;
            }
            char left = pop(&s);
            if (!is_match(left, input[i])) {
                printf("%d:%c\n", i, input[i]);
                return;
            }

        }
    }
    if (s.top != -1) {
        char c;
        printf("open:");
        while (s.top != -1){
            c = pop(&s);
            switch (c) {
                case'(':
                    printf(")");
                    break;
                case'[':
                    printf("]");
                    break;
                case'{':
                    printf("}");
                    break;
            }
        }
//            printf("%c", pop(&s));
//        printf("\n");
    }
    else
        printf("所有括号匹配成功!\n");
    return;
}

int main() {
    char input[100];
    printf("请输入字符串:");
    scanf("%s", input);
    process_input(input);
    return EXIT_SUCCESS;
}

你可能感兴趣的:(java,数据结构)