c++定义一个链栈的类,实现以下操作:插入、删除、判断栈是否栈空、读取栈栈顶元素、析构函数。 要求实现完整程序,有必要的结果输出。 两个栈中元素值和个数自定。
时间: 2024-10-18 15:23:20 浏览: 37
在C++中,我们可以创建一个名为`Stack`的链式栈类,包含上述提到的功能。这里是一个简单的实现示例:
```cpp
#include <iostream>
using namespace std;
// 定义节点结构体
struct Node {
int data;
Node* next;
};
class Stack {
private:
Node* top; // 栈顶指针
public:
// 构造函数
Stack() : top(nullptr) {}
// 插入元素到栈顶
void push(int value) {
Node* newNode = new Node();
newNode->data = value;
newNode->next = top;
top = newNode;
cout << "Inserted " << value << endl;
}
// 删除并返回栈顶元素(如果为空则抛异常)
int pop() {
if (top == nullptr) {
throw runtime_error("Stack is empty");
}
int value = top->data;
Node* temp = top;
top = top->next;
delete temp;
return value;
}
// 判断栈是否为空
bool isEmpty() const {
return top == nullptr;
}
// 读取栈顶元素(不会修改栈,但未提供返回值,因为堆栈操作通常不需要直接获取数据)
void peek() const {
if (isEmpty()) {
cerr << "Top element is not available since the stack is empty" << endl;
} else {
cout << "Top element: " << top->data << endl;
}
}
// 析构函数,清理资源
~Stack() {
Node* current = top;
while (current != nullptr) {
Node* nextTemp = current->next;
delete current;
current = nextTemp;
}
cout << "Stack destructor called." << endl;
}
};
int main() {
Stack stack1;
Stack stack2;
// 插入元素到两个栈
for (int i = 0; i < 5; ++i) {
stack1.push(i);
stack2.push(i * 2);
}
// 操作栈,并检查状态
cout << "Stack 1 elements: ";
try {
while (!stack1.isEmpty()) {
stack1.peek();
stack1.pop();
}
} catch (const runtime_error& e) {
cerr << e.what() << endl;
}
cout << "Stack 2 elements: ";
while (!stack2.isEmpty()) {
stack2.peek();
stack2.pop();
}
return 0;
}
```
在这个例子中,我们创建了两个`Stack`对象`stack1`和`stack2`,并分别插入了一些整数值。然后我们依次从每个栈中弹出并打印元素,直到栈为空。
注意,这个程序并没有返回值,而是直接显示栈顶元素,因为它是一个只读操作。此外,我们在主函数中添加了异常处理,当尝试从空栈中弹出元素时会捕获`runtime_error`异常。最后,`Stack`类的析构函数会在程序结束时自动调用,释放所有动态分配的内存。
阅读全文