1.设计一个算法,要求判别一个算术表达式中的圆括号配对是否正确.假设表达式在字符数组a1中,使用一堆栈S来帮助判断. 下面是已知的seqstack.h文件(该文件中的函数原型已经有其他人实现.)

1.设计一个算法,要求判别一个算术表达式中的圆括号配对是否正确.假设表达式在字符数组a1中,使用一堆栈S来帮助判断.
下面是已知的seqstack.h文件(该文件中的函数原型已经有其他人实现.)
#define MAXLEN 10
typedef char datatype;

左括号入栈,遇到右括号出栈匹配即可

#define MAXLEN 10
typedef char datatype;
typedef struct
{
datatype data[MAXLEN];
int top;
} SeqStack;
SeqStack *Snull();//置空栈
int Push (SeqStack *s,datatype x) ;进栈操作
int Pop (SeqStack *s,datatype *x);出栈操作
int ReadTop (SeqStack *s,datatype x);读栈顶元素
int Sempty(SeqStack
s) :判栈空
int Sfull(SeqStack *s);判栈满
void Realsememory(SeqStack *s);释放栈

详细的解法和代码实现如下,望采纳

可以使用一个栈来帮助判断算术表达式中的圆括号是否正确配对。

  • 首先遍历整个表达式,对于每个字符,如果它是左圆括号,就将它压入栈中;如果它是右圆括号,就将栈顶元素弹出。
  • 在遍历过程中
    • 如果遇到的是左圆括号,就将其压入栈中。
    • 如果遇到的是右圆括号,就将栈顶元素弹出。
    • 如果遇到的是非圆括号字符,就忽略它。
  • 如果栈为空,或者遇到的是右圆括号但栈顶元素不是对应的左圆括号,则表达式中的圆括号不匹配。
#include <iostream>
#include "seqstack.h"

using namespace std;

bool checkBrackets(char *expression) {
  SeqStack stack;
  InitStack(&stack);

  for (int i = 0; expression[i] != '\0'; i++) {
    char ch = expression[i];
    if (ch == '(' || ch == '[' || ch == '{') {
      // 如果遇到左圆括号,将其压入栈中
      Push(&stack, ch);
    } else if (ch == ')' || ch == ']' || ch == '}') {
      // 如果遇到右圆括号,则将栈顶元素弹出
      char top;
      if (!Pop(&stack, &top)) {
        // 如果栈为空,则表达式中的圆括号不匹配
        return false;
      }
      if ((ch == ')' && top != '(') ||
          (ch == ']' && top != '[') ||
          (ch == '}' && top != '{')) {
        // 如果遇到的是右圆括号但栈顶元素不是对应的左圆括号,则表达式中的圆括号不匹配
        return false;
      }
    }
  }

  // 如果栈不为空,则表达式中的圆括号不匹配
  return IsEmpty(stack);
}

int main() {
  char expression[MAXLEN];
  cout << "请输入算术表达式:" << endl;
  cin >> expression;

  if (checkBrackets(expression)) {
    cout << "圆括号匹配" << endl;
  } else {
    cout << "圆括号不匹配" << endl;
  }

  return 0;
}

下面是一个使用C语言实现的算法:

#include "seqstack.h"  // 引入seqstack.h头文件

// 判断算术表达式中的圆括号配对是否正确
// 参数a1:算术表达式的字符数组
// 返回值:配对正确返回1,否则返回0
int checkBracketPair(char a1[])
{
    SeqStack S;  // 定义一个栈
    InitStack(&S);  // 初始化栈
    int i = 0;  // 定义循环变量i

    // 循环处理字符数组中的每一个字符
    while (a1[i] != '\0') {
        // 如果是左圆括号,则压入栈中
        if (a1[i] == '(') {
            Push(&S, a1[i]);
        }
        // 如果是右圆括号,则弹出栈顶元素,判断是否与之配对
        else if (a1[i] == ')') {
            char c;
            Pop(&S, &c);  // 弹出栈顶元素
            if (c != '(') {  // 判断是否与之配对
                return 0;  // 配对不正确,返回0
            }
        }
        i++;  // 指针后移
    }

    // 循环结束后,判断栈是否为空
    if (StackEmpty(S)) {
        return 1;  // 栈为空,说明配对正确,返回1
    } else {
        return 0;  // 栈不为空,说明左圆括号多余,返回0
    }
}