#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MAX_SIZE 100000 //将ab两个符号看成是括号的左边和右边,a为左,b为右,原理与括号匹配一致 //链式栈 typedef struct Node { char data; struct Node* next; }Node; typedef struct { Node* top; } LinkedStack; //初始化链式栈 void initLinkedStack(LinkedStack* stack) { stack->top = NULL; } //检查栈是否为空 bool isEmpty(LinkedStack* stack) { return stack->top == NULL; } //入栈操作 void push(LinkedStack* stack, char data) { Node* newNode = (Node*)malloc(sizeof(Node)); if(newNode == NULL) { printf("newNode create falied\n"); return; } newNode->data = data; newNode->next = stack->top; stack->top = newNode; } //出栈操作 void pop(LinkedStack* stack) { //先判断栈是否为空 if(isEmpty(stack)) { printf("Stack is Empty\n"); return; } Node* temp = stack->top; char data = temp->data; stack->top = temp->next; free(temp); } //获取栈顶元素 char peek(LinkedStack* stack) { if(isEmpty(stack)) { printf("Stack is Empty\n"); return 1; } return stack->top->data; } //释放栈内存 void freeStack(LinkedStack* stack) { while(!isEmpty(stack)) { pop(stack); } } bool isGoodString(char* s) { LinkedStack stack; initLinkedStack(&stack); for(int i = 0; s[i] != '\0'; i++) { if(s[i] == 'a') { push(&stack, s[i]); } else { if(isEmpty(&stack)) { return false; } char temp = peek(&stack); if(s[i] == 'b' && temp != 'a') { return false; } pop(&stack); } } return isEmpty(&stack); } int main() { LinkedStack stack; LinkedStack* stack_ptr = &stack; initLinkedStack(stack_ptr); char data[MAX_SIZE] = {'\0'}; scanf("%s",data); getchar(); if(isGoodString(data)) { printf("Good\n"); } else { printf("Bad\n"); } freeStack(stack_ptr); return 0; }