用顺序栈实现括号匹配(C语言)

主要思想:
用栈实现括号匹配:依次扫描所有字符,遇到左括号则入栈,遇到右括号则弹出栈顶元素检查是否匹配。 

匹配失败情况:
1、左括号单身
2、右括号单身
3、左右括号不匹配

#include <iostream>
#include <stdio.h>

//定义一个结构体
#define MaxSize 10
typedef struct
{
    char data[MaxSize];
    int top;
}SqStack;
//初始化
void InitStack(SqStack &S)
{
    S.top = -1;
}
//判断栈是否为空
bool StackEmpty(SqStack &S)
{
    if(S.top == -1)
        return true;
    else
        return false;
}
//新元素入栈
bool Push(SqStack &S,char x)
{
    //先判断栈是否已经满了
    if(S.top == MaxSize-1)
        return false;
    S.top = S.top+1;
    S.data[S.top] = x;
    return true;
}
//出栈,用x返回
bool Pop(SqStack &S,char &x)
{
    //先判断是否为空
    if(S.top == -1)
        return false;
    x = S.data[S.top];
    S.top = S.top-1;
    return true;
}

//括号匹配核心代码
bool bracket(char str[],int length)
{
    SqStack S;
    InitStack(S);
    for(int i = 0;i<length;i++)
    {
        if(str[i]=='['||str[i]=='{'||str[i]=='(')
            {
                Push(S,str[i]);
            }
            else
            {
                if(StackEmpty(S))
                    return false;

                char topElem;
                Pop(S,topElem);
                if(str[i]==')'&&topElem!='(')
                    return false;
                if(str[i]==']'&&topElem!='[')
                    return false;
                if(str[i]=='}'&&topElem!='{')
                    return false;

            }
    }
    return StackEmpty(S);
}
//主函数
int main()
{
    char x;
    char str[]={'[','(',']',']'};
    int lenth = sizeof(str)/sizeof(char);
    for(int i= 0;i<lenth;i++)
    {
        printf("%c",str[i]);
    }
    printf("\n");
    if(bracket(str,lenth))
    {
        printf("匹配成功");
    }
    else
    {
        printf("匹配失败");
    }
    return 0;


}

  • 9
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C语言中可以使用顺序表来实现数组,也可以使用链表来实现动态分配内存的数据结构。如果想要实现哈希表,可以使用结构体数组和链表结合的方式来实现。 对于顺序表实现数组,可以通过定义一个固定长度的数组来存储数据,并且可以通过下标索引来访问数组中的元素。例如: ``` #define MAXSIZE 100 int array[MAXSIZE]; ``` 对于链表实现动态分配内存的数据结构,可以使用结构体来定义每一个节点,并且节点中包含一个指向下一个节点的指针。例如: ``` struct Node { int data; struct Node *next; }; ``` 对于哈希表的实现,可以使用结构体数组来表示哈希表中的每一个元素,每个元素可以包含一个链表,用来存储具有相同哈希值的元素。例如: ``` #define HASHSIZE 100 struct Node { int data; struct Node *next; }; struct HashTable { struct Node *list; }; struct HashTable hashtable[HASHSIZE]; ``` 在使用哈希表时,可以通过计算每个元素的哈希值,将元素存储到对应的链表中。当需要查找元素时,只需要计算出元素的哈希值,然后在对应的链表中查找即可。 ### 回答2: C语言中可以使用顺序栈实现括号匹配。 首先,我们需要定义一个结构体来表示顺序栈,包括栈的最大容量和当前的栈顶指针。可以使用一个一维数组来实现栈的存储。 然后,我们需要实现两个基本的操作:入栈和出栈。入栈操作将一个元素添加到栈的顶部,出栈操作将栈顶的元素移除。 在进行括号匹配时,我们可以遍历输入的字符串中的每个字符。当遇到左括号时,我们将其入栈;当遇到右括号时,我们将其与栈顶元素进行匹配。如果栈顶元素为对应的左括号,则将栈顶元素出栈;否则,表示括号不匹配。 当遍历完所有字符后,如果栈为空,说明所有的括号都匹配成功。如果栈不为空,说明还有未匹配的括号。 以下是一个用C语言实现括号匹配的示例代码: ```c #include <stdio.h> #define MAX_SIZE 100 // 定义顺序栈结构体 typedef struct { char data[MAX_SIZE]; int top; } Stack; // 初始化栈 void init(Stack *stack) { stack->top = -1; } // 判断栈是否为空 int isEmpty(Stack *stack) { return stack->top == -1; } // 入栈 void push(Stack *stack, char c) { if (stack->top == MAX_SIZE - 1) { printf("Stack is full\n"); return; } stack->data[++(stack->top)] = c; } // 出栈 char pop(Stack *stack) { if (isEmpty(stack)) { printf("Stack is empty\n"); return '\0'; } return stack->data[(stack->top)--]; } // 括号匹配 int matchBrackets(char *str) { Stack stack; init(&stack); int i = 0; while (str[i] != '\0') { if (str[i] == '(' || str[i] == '[' || str[i] == '{') { push(&stack, str[i]); } else if (str[i] == ')' || str[i] == ']' || str[i] == '}') { if (isEmpty(&stack)) { return 0; } char topChar = pop(&stack); if ((str[i] == ')' && topChar != '(') || (str[i] == ']' && topChar != '[') || (str[i] == '}' && topChar != '{')) { return 0; } } i++; } return isEmpty(&stack); } int main() { char *str = "[()]{}{[()()]()}"; if (matchBrackets(str)) { printf("括号匹配成功\n"); } else { printf("括号匹配失败\n"); } return 0; } ``` 以上示例中,我们使用了一个字符数组来表示输入的字符串,并定义了一个`Stack`结构体来实现顺序栈。在`matchBrackets`函数中,我们遍历输入字符串的每个字符,并根据字符的类型进行相应的操作。最后,根据栈是否为空来判断括号是否匹配成功,并输出结果。 注意,在实际应用中,我们可能还需要处理其他的情况,如字符不是括号或者存在其他字符等。这里的示例只是简单地实现括号匹配的基本逻辑。 ### 回答3: C语言可以用顺序栈实现括号匹配。首先,我们需要定义一个存储括号的顺序栈结构,其中包含一个数组用来存放括号元素,以及一个指针top来指示栈顶位置。 当开始遍历表达式时,我们遇到左括号时,将其入栈,当遇到右括号时,我们将比较栈顶元素与当前括号是否匹配。如果匹配,则弹出栈顶元素,继续遍历;如果不匹配,表明括号不匹配,直接返回不匹配的结果。 在遍历完成后,如果栈为空,则说明所有括号都匹配成功,如果栈不为空,则说明有括号没有匹配成功,返回括号不匹配的结果。 以下是用C语言实现括号匹配的代码: ```c #include <stdio.h> #include <stdbool.h> #define MAX_SIZE 50 typedef struct { char data[MAX_SIZE]; int top; } Stack; void init(Stack *stack) { stack->top = -1; } bool isEmpty(Stack *stack) { return stack->top == -1; } void push(Stack *stack, char c) { if(stack->top == MAX_SIZE - 1) { printf("Stack overflow!\n"); return; } stack->data[++(stack->top)] = c; } char pop(Stack *stack) { if(isEmpty(stack)) { printf("Stack underflow!\n"); return '\0'; } return stack->data[(stack->top)--]; } bool isMatching(char left, char right) { if(left == '(' && right == ')') return true; else if(left == '[' && right == ']') return true; else if(left == '{' && right == '}') return true; else return false; } bool isBalanced(char expression[]) { Stack stack; init(&stack); for(int i = 0; expression[i] != '\0'; i++) { if(expression[i] == '(' || expression[i] == '[' || expression[i] == '{') { push(&stack, expression[i]); } else if(expression[i] == ')' || expression[i] == ']' || expression[i] == '}') { if(isEmpty(&stack) || !isMatching(pop(&stack), expression[i])) { return false; } } } return isEmpty(&stack); } int main() { char expression[MAX_SIZE]; printf("请输入一个表达式:"); scanf("%s", expression); if(isBalanced(expression)) { printf("括号匹配成功!\n"); } else { printf("括号匹配失败!\n"); } return 0; } ``` 在这个实现中,我们用init()函数初始化了栈,用isEmpty()函数判断栈是否为空,用push()函数将元素入栈,用pop()函数弹出栈顶元素。isMatching()函数用来判断两个括号是否匹配。isBalanced()函数用来检查整个表达式的括号是否匹配。在主函数中,我们首先输入一个表达式,然后调用isBalanced()函数判断括号是否匹配,并输出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值