21xrx.com
2025-04-16 15:24:42 Wednesday
文章检索 我的文章 写文章
C++实现栈的出栈入栈操作,判断符号是否匹配
2023-06-30 13:23:03 深夜i     16     0
C++ 出栈 入栈 符号匹配

栈是计算机科学中常见的一种数据结构,它可以实现快速的入栈和出栈操作,使得程序的执行效率得以提升。在C++语言中,我们可以通过定义一个类来实现栈的出栈入栈操作,并且还可以利用栈来判断符号是否匹配。

栈的实现可以基于数组或链表来完成,这里我们以数组作为底层数据结构来实现。首先,我们需要定义一个Stack类,在Stack类内部,我们需要一个数据成员来存储栈中的元素,另外还需要一个成员变量来记录栈顶的位置,以及一些方法来对栈进行操作。

下面是一个基于数组的Stack类的实现:

#define MAX_SIZE 1000 // 栈的最大容量
class Stack {
 private:
  char data[MAX_SIZE]; // 存储栈中的元素
  int top_index; // 栈顶的位置
 public:
  Stack()
   top_index = -1; // 初始化栈顶位置为-1
  
  bool is_empty()
   return top_index == -1; // 栈为空时
  void push(char c) {
   if (top_index == MAX_SIZE - 1)
    // 栈已满
   top_index++; // 栈顶位置加1
   data[top_index] = c; // 元素入栈
  }
  char pop() {
   if (is_empty()) {
    // 栈为空,无法出栈
    cout << "Stack underflow" << endl;
    return '\0';
   }
   char c = data[top_index]; // 取出栈顶元素
   top_index--; // 栈顶位置减1
   return c;
  }
  char peek() {
   if (is_empty()) {
    // 栈为空,无法查看栈顶元素
    cout << "Stack empty" << endl;
    return '\0';
   }
   return data[top_index]; // 返回栈顶元素
  }
};

在这个Stack类中,我们定义了一个数组data来存储栈中的元素,以及一个整型变量top_index来记录栈顶的位置。is_empty方法用来检查栈是否为空,push方法用来将元素入栈,pop方法用来将元素出栈,peek方法用来返回栈顶元素。其中,当栈已满时,push方法将不会将元素入栈,而是输出提示信息。当栈为空时,pop和peek方法也将不会弹出或返回元素,并输出提示信息。

有了这个Stack类,我们就可以使用它来进行符号匹配检查了。例如,当我们需要检查一个字符串中的圆括号是否匹配时,可以先将字符依次入栈,当遇到右括号时,将栈顶元素出栈并与右括号进行比较,如果匹配则继续检查下一个字符,如果不匹配则表示括号不匹配。

下面是一个检查圆括号是否匹配的例子:

bool check_parenthesis(const string& s) {
 Stack stack;
 
 for (int i = 0; i < s.size(); i++) {
  if (s[i] == '(') { // 左括号入栈
   stack.push(s[i]);
  } else if (s[i] == ')') { // 右括号匹配
   if (stack.is_empty() || stack.pop() != '(') { // 栈为空或栈顶元素与右括号不匹配
    return false;
   }
  }
 }
 return stack.is_empty(); // 如果栈为空,则表示所有左括号都匹配成功
}

在这个例子中,我们先定义了一个check_parenthesis函数,这个函数使用了Stack类来检查圆括号是否匹配。函数接受一个字符串参数,这个字符串包含了需要检查的圆括号。我们遍历这个字符串中的所有字符,当遇到左括号时,将其入栈,当遇到右括号时,将栈顶元素出栈并与右括号进行比较。如果栈为空或栈顶元素与右括号不匹配,则表示圆括号不匹配。

如果整个字符串遍历完成后,栈为空,则表示所有左括号都匹配成功,否则就表示圆括号不匹配。下面是一个测试例子:

int main() {
 string s1 = "((()))";
 string s2 = "()()()";
 string s3 = "((())";
 string s4 = ")())(";
 cout << check_parenthesis(s1) << endl; // true
 cout << check_parenthesis(s2) << endl; // true
 cout << check_parenthesis(s3) << endl; // false
 cout << check_parenthesis(s4) << endl; // false
 
 return 0;
}

在这个例子中,我们定义了4个测试用例,s1和s2中的圆括号都匹配成功,s3和s4中的圆括号不匹配。运行程序后,程序将输出true或false来表示圆括号是否匹配。

综上所述,C++的栈类提供了方便的入栈和出栈操作,可以用来实现一些常见的数据结构和算法。在实际开发中,我们可以使用栈来检查符号是否匹配,实现代码的优化和性能的提升。

  
  

评论区

请求出错了