堆栈(Stack)是一种特殊的顺序存储表,只允许在表的一端(栈顶)进行插入和删除操作,另一端(栈底)则不允许插入和删除操作,堆栈的插入和删除通常称为入栈和出栈。栈顶的当前位置是动态的,用一个指针,即栈顶指针来标示栈顶当前位置。如下图所示: 堆栈可以用数组来表示,假设堆栈可保存的数据类型为char。那么堆栈数据成员如下: char element[MAXSIZE]; int index; //堆栈指针 堆栈相关的成员函数如下: void push(char item); //元素item进栈,即插入item到栈顶; void pop( ); //弹出栈顶元素; char top(); //返回栈顶元素的值,但不移动栈顶指针; bool isEmpty(); //判断堆栈是否为空 解决问题: (1)根据上述提示实现一个堆栈;注意栈空和栈满情况的处理; (2)堆栈在计算机语言中的编译过程中用来进行语法检查,编写一个程序,利用堆栈来检查一个C/C++语言程序中的花括号、方括号和圆括号是否配对。尝试说明程序中可能出现的问题
时间: 2023-12-03 20:45:52 浏览: 145
1. 实现堆栈代码如下:
```c++
#define MAXSIZE 100 //定义堆栈最大容量
class Stack {
private:
char element[MAXSIZE];
int index; //堆栈指针
public:
Stack() { index = -1; } //构造函数,堆栈初始为空
void push(char item) {
if (index == MAXSIZE - 1) //判断堆栈是否已满
cout << "Stack Overflow!" << endl;
else {
index++; //栈顶指针加1
element[index] = item; //元素进栈
}
}
void pop() {
if (index == -1) //判断堆栈是否为空
cout << "Stack Underflow!" << endl;
else
index--; //栈顶指针减1,元素出栈
}
char top() {
if (index == -1) { //判断堆栈是否为空
cout << "Stack is Empty!" << endl;
return '\0';
}
else
return element[index]; //返回栈顶元素的值
}
bool isEmpty() { return (index == -1); } //判断堆栈是否为空
};
```
2. 利用堆栈来检查一个C/C++语言程序中的花括号、方括号和圆括号是否配对的代码如下:
```c++
#include <iostream>
#include <stack>
#include <cstring>
using namespace std;
int main() {
char str[1000];
stack<char> s;
bool flag = true;
cin.getline(str, 1000);
for (int i = 0; i < strlen(str); i++) {
if (str[i] == '(' || str[i] == '[' || str[i] == '{')
s.push(str[i]); //左括号进栈
else if (str[i] == ')') {
if (!s.empty() && s.top() == '(')
s.pop(); //右括号与栈顶元素匹配,弹出栈顶元素
else {
flag = false; //括号不匹配,标志位设为false
break;
}
}
else if (str[i] == ']') {
if (!s.empty() && s.top() == '[')
s.pop();
else {
flag = false;
break;
}
}
else if (str[i] == '}') {
if (!s.empty() && s.top() == '{')
s.pop();
else {
flag = false;
break;
}
}
}
if (!s.empty()) flag = false; //栈中还有元素,括号不匹配
if (flag) cout << "Matched!" << endl;
else cout << "Not Matched!" << endl;
return 0;
}
```
该程序利用了STL中的stack容器来实现堆栈,遍历输入的字符串,如果遇到左括号就进栈,遇到右括号就与栈顶元素匹配,匹配成功弹出栈顶元素,匹配失败则括号不匹配,标志位设为false,退出遍历。最后再判断栈中是否还有元素,如果有则括号不匹配。程序输出“Matched!”表示括号全部匹配,“Not Matched!”表示括号不匹配。
可能出现的问题:
- 栈溢出(Stack Overflow):当堆栈的元素个数超过最大容量时,就会发生栈溢出的错误。
- 栈下溢(Stack Underflow):当堆栈为空时,执行弹出操作就会发生栈下溢的错误。
- 括号不匹配:当输入的字符串中左右括号不匹配时,程序会输出“Not Matched!”,但不会给出具体的错误信息。
阅读全文