21xrx.com
2024-12-22 22:33:50 Sunday
登录
文章检索 我的文章 写文章
C++实现栈的出栈入栈操作,判断符号是否匹配
2023-06-30 13:23:03 深夜i     --     --
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++的栈类提供了方便的入栈和出栈操作,可以用来实现一些常见的数据结构和算法。在实际开发中,我们可以使用栈来检查符号是否匹配,实现代码的优化和性能的提升。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复