建立栈的顺序存储结构和链式存储结构;基于顺序存储结构完成栈的各项基本操作。在主函数中使用该结构和基本操作,判断字符串是否中心对称。完整代码和运行结果
时间: 2024-10-23 13:15:30 浏览: 19
数据结构实验一线性表的顺序存储结构.doc
建立栈的数据结构主要有两种方式:
1. **顺序存储结构(Array-Based Stack)**:
这种方式通常使用数组作为底层数据结构。栈顶元素位于数组的最后一个位置。插入(push)新元素时,将元素添加到数组的末尾;删除(pop)元素时,从数组顶部移除并返回。由于数组的随机访问特性,插入和删除操作的时间复杂度为O(1)。
2. **链式存储结构(Linked List-Based Stack)**:
使用链表更方便处理动态增长。栈顶节点包含指向下一个节点的指针,并且自身没有大小限制。插入(push)操作时,在链表头部添加新节点;删除(pop)操作时,弹出并返回头节点。
下面是一个简单的顺序存储结构的栈以及栈的操作示例(C++代码):
```cpp
#include <iostream>
using namespace std;
// 定义栈模板
template<typename T>
class Stack {
private:
int top;
T elements[100]; // 假设数组容量为100
public:
Stack() : top(-1) {} // 初始化栈顶为-1表示空栈
// 插入操作(Push)
void push(T item) {
if (top == 99) {
cout << "Stack overflow!\n";
return;
}
top++;
elements[top] = item;
}
// 删除操作(Pop)
T pop() {
if (top == -1) {
cout << "Stack underflow!\n";
return T();
}
T item = elements[top];
top--;
return item;
}
// 检查栈是否为空
bool isEmpty() { return top == -1; }
};
// 主函数
int main() {
Stack<char> strStack;
strStack.push('a');
strStack.push('b');
strStack.push('c');
char poppedChar;
while (!strStack.isEmpty()) {
poppedChar = strStack.pop();
cout << "Popped character: " << poppedChar << "\n";
}
// 中心对称判断示例
string inputStr;
cin >> inputStr;
int halfLen = inputStr.length() / 2;
bool isSymmetric = true;
for (int i = 0; i <= halfLen; ++i) {
if (inputStr[i] != inputStr[inputStr.length() - 1 - i]) {
isSymmetric = false;
break;
}
}
if (isSymmetric)
cout << "The string is center-symmetric.\n";
else
cout << "The string is not center-symmetric.\n";
return 0;
}
```
**运行结果**:
假设输入字符串是`abcba`,程序会依次弹出每个字符,然后检查字符串是否中心对称。在这个例子中,字符串是中心对称的,所以输出将是"abcba"(中间的字符是对称的)和"The string is center-symmetric."。
**相关问题--:**
1. 顺序存储结构的栈相比链式存储结构有哪些优点和缺点?
2. 在链式存储结构的栈中,如何实现插入和删除操作?
3. 如果需要支持大容量的栈,你会选择哪种存储结构?为什么?
阅读全文