如何使用C#控制台实现一个基于栈数据结构的表达式括号匹配器?包括检查栈是否为空、执行入栈操作、出栈操作以及获取栈顶元素的功能,同时处理正确的括号配对逻辑。
时间: 2024-10-26 18:16:47 浏览: 21
数据结构入栈和出栈实例
在C#中,你可以创建一个`Stack<char>`来存储输入的字符,其中`char`是用于表示括号的数据类型。下面是一个基本的步骤说明:
1. 定义一个名为`BracketMatcher`的类,包含一个`Stack<char>`类型的实例变量`openBrackets`来保存打开的括号。
```csharp
using System;
using System.Collections.Generic;
public class BracketMatcher
{
private Stack<char> openBrackets = new Stack<char>();
}
```
2. 创建入栈(push)方法,当遇到开放括号('(', '[', '{')时,将其压入栈中。
```csharp
public void Push(char bracket)
{
if (IsOpening(bracket))
{
openBrackets.Push(bracket);
}
}
```
3. 出栈(pop)方法,当遍历到关闭括号时,检查栈顶元素是否与其匹配。如果是,则弹出;如果不是,表示未闭合的括号错误。
```csharp
private bool IsClosing(char closingBracket)
{
switch (closingBracket)
{
case ')':
return openBrackets.Peek() == '(';
case ']':
return openBrackets.Peek() == '[';
case '}':
return openBrackets.Peek() == '{';
default:
return false;
}
}
public void Pop()
{
if (!openBrackets.isEmpty())
{
char topBracket = openBrackets.Pop();
if (!IsClosing(topBracket))
{
// 括号不匹配,记录错误
Console.WriteLine($"Error: Mismatched brackets ({topBracket})");
}
}
else
{
throw new InvalidOperationException("Tried to pop from an empty stack");
}
}
```
4. 检查栈是否为空。可以使用`isEmpty()`方法,但在C#中需要自定义这个方法,因为`Stack<T>`类本身没有提供此功能。
```csharp
public bool IsEmpty()
{
return openBrackets.Count == 0;
}
```
5. 获取栈顶元素,同样如果栈为空则抛异常。
```csharp
public char Peek()
{
if (IsEmpty())
{
throw new InvalidOperationException("Cannot peek at an empty stack");
}
return openBrackets.Peek();
}
```
6. 最后,遍历整个输入字符串,调用上述方法进行匹配。如果有错误的括号组合,可以在遍历结束后输出所有找到的问题。
为了判断整个表达式是否有效,你可以将上述方法放入一个`MatchExpression`方法中,并返回一个布尔值表示是否所有括号都已正确匹配。
```csharp
public bool MatchExpression(string expression)
{
foreach (char c in expression)
{
if (char.IsDigit(c) || char.IsLetter(c) || c == '.')
{
// 对于数字、字母或点,直接忽略
}
else
{
Push(c);
}
}
while (!openBrackets.IsEmpty())
{
Pop();
}
return openBrackets.IsEmpty();
}
```
阅读全文