107 lines
2.1 KiB
C++
107 lines
2.1 KiB
C++
// 设计一个 Stack 的类,实现栈的基本操作,包括入栈、出栈和判断栈是否为空等。主要用于存放int数值或string字符串,并对其操作。
|
||
// 【提示】
|
||
// 1\) 使用数组实现,每一次重分数组空间的大小是原大小的2倍;
|
||
|
||
// 2\) Stack是栈的结构(FILO先进后出的)
|
||
#include <iostream>
|
||
#include <cstring>
|
||
#include <cstdlib>
|
||
|
||
using namespace std;
|
||
|
||
class Stack
|
||
{
|
||
private:
|
||
int capacity; // 栈容量
|
||
int size; // 当前栈中元素个数
|
||
int *data; // 存放栈的数组
|
||
public:
|
||
Stack()
|
||
{
|
||
this->capacity = 10; // 初始容量
|
||
this->size = 0;
|
||
this->data = new int[this->capacity]; // 初始化栈数据数组
|
||
}
|
||
~Stack()
|
||
{
|
||
delete[] data; // 删除栈数据数组
|
||
}
|
||
|
||
public:
|
||
void push(int value); // 入栈
|
||
int pop(); // 出栈
|
||
int isEmpty(); // 判断栈空否
|
||
};
|
||
|
||
void Stack::push(int value)
|
||
{
|
||
if (size == capacity)
|
||
{
|
||
cout << "栈满,重新分配空间中" << endl;
|
||
int newCapacity = capacity * 2;
|
||
int *newData = new int[newCapacity];
|
||
for (int i = 0; i < size; i++)
|
||
{
|
||
newData[i] = data[i];
|
||
}
|
||
delete[] data;
|
||
data = newData;
|
||
capacity = newCapacity;
|
||
cout << "空间分配完成,数据转存完毕" << endl;
|
||
}
|
||
data[size] = value;
|
||
cout << value << " 入栈成功" << endl;
|
||
size++;
|
||
}
|
||
|
||
int Stack::pop()
|
||
{
|
||
if (size == 0)
|
||
{
|
||
cout << "栈空" << endl;
|
||
}
|
||
else
|
||
{
|
||
int popValue = data[size - 1];
|
||
size--;
|
||
cout << "出栈成功" << endl;
|
||
return popValue;
|
||
}
|
||
}
|
||
|
||
int Stack::isEmpty()
|
||
{
|
||
if (size == 0)
|
||
{
|
||
cout << "栈空" << endl;
|
||
return 1; // 非 0 为栈空
|
||
}
|
||
else
|
||
{
|
||
return 0;
|
||
cout << "栈不空" << endl;
|
||
}
|
||
}
|
||
|
||
int main()
|
||
{
|
||
Stack stk;
|
||
|
||
stk.push(10);
|
||
stk.push(12);
|
||
stk.push(16);
|
||
stk.push(5);
|
||
|
||
while (!stk.isEmpty())
|
||
{
|
||
cout << stk.pop() << " ";
|
||
}
|
||
cout << endl;
|
||
|
||
// stk.push(7);
|
||
|
||
stk.isEmpty();
|
||
|
||
return 0;
|
||
}
|