数据结构-栈(C++实现)
栈:一种线性结构,不过是先进后出,实际生活中随处可见的例子是弹夹,先压进去的子弹最后打出,后压进去的子弹最先打出
栈的顶部称为栈顶,底部称为栈底
栈空的条件:栈顶指针的索引为-1
栈满的条件:栈顶指针指向栈容量大小-1的位置
栈的实现方式:数组栈、链栈,具体见代码实现
栈的特殊情况:共享栈,共享栈就是将两个栈组合起来
共享栈满的条件是:第一个栈的栈顶指针+1=第二个栈的栈顶指针
共享栈为空的条件是:第一个栈的栈顶指针为0,第二个栈的栈顶指针指向共享栈大小-1的位置
代码实现:
1、线性栈的实现
1.1、.h文件
using namespace std;class Stack{private:int top; //栈顶int data[MAXSIZE]; //栈底为data[0]public:Stack(); //构造函数~Stack(); //析构函数bool push(int val); //进栈void traverse(); //遍历bool pop(int& val); //出栈bool is_empty(); //判断是否为空bool is_full(); //判断是否栈满};Stack::Stack():top(-1) //初始化参数,将栈顶指针指向-1的位置{}//析构函数Stack::~Stack(){}//进栈操作bool Stack:: push(int val){//首先判断栈是否已满if (is_full()){return false;}//栈不满的情况下,先将栈顶指针移动一位,再插入元素top++; //栈顶指针加一data[top] = val; //插入元素return true;}//出栈操作bool Stack::pop(int& val){//首先判断栈是否为空,为空则没有元素出栈if (is_empty()){return false;}//栈不为空时,先将元素弹出,再将栈顶指针减一val = data[top];top--;return true;}//遍历栈void Stack::traverse(){int p = top; //指定一个标志指向栈顶while (p != -1) //当栈不为空时{cout << data[p] << " ";p--;//p向下移动一个位置}cout << endl;}//判断栈是否满bool Stack::is_full(){return MAXSIZE - 1 == top ? true : false; //如果栈中的元素个数减一为栈顶指针的位置,则判断栈满}bool Stack::is_empty(){return -1 == top ? true : false; //当栈顶指针为-1时,表示栈为空}
1.2、.cpp文件
using namespace std;int main(){Stack s; //创建栈对象int val;s.push(1);s.push(2);s.push(3);s.push(4);s.push(5);s.traverse(); //遍历栈s.pop(val); //出栈cout << "出栈的值为:" << val << endl;system("pause");return 0;}
2、链栈的实现
链栈的实现类似于单链表,不过是先进后出
2.1、定义结点
/*tangzhao2021.4.14*/class Node{public:Node(); //构造函数~Node(); //析构函数friend class Stack;private:int data; //数据域与指针域Node* pNext; //数据域与指针域};
2.2、定义操作的头文件
/*tangzhao2021.4.14*/using namespace std;class Stack{public:Stack();~Stack();bool push(int val); //进栈void traverse(); //遍历bool pop(int& val); //出栈bool empty();void clear(); //清空private:Node* pTop; //栈顶Node* pBottom; //栈底};Stack::Stack(){}//析构Stack::~Stack(){}//进栈bool Stack::push(int val){//因为是链栈,所以不需要判断栈是否已满Node* pNew = new Node; //创立一个新的结点pNew->data = val;pNew->pNext = pTop; //将新结点的指针指向栈顶指针pTop = pNew; //将栈顶指针指向新的元素位置return true;}//遍历栈void Stack::traverse(){Node* p = pTop; //新建一个指针指向栈顶位置while (p != pBottom) //栈不为空{cout << p->data << " ";p = p->pNext; //将p指向下一个元素的位置}cout << endl;}//出栈bool Stack::pop(int& val){if (empty()){return false;}Node* r = pTop; //新建一个指针指向栈顶元素val = r->data; //取出要出栈的元素pTop = pTop->pNext; //将栈顶指针下移delete r;return true;}//判断栈是否为空bool Stack::empty(){return pTop == pBottom ? true : false;}//清理栈void Stack::clear(){if (empty()){return;}Node* p = pTop;Node* q = NULL;while (p != pBottom){q = p->pNext;delete p;p = q;}}
2.3、.cpp主文件
/*tangzhao2021.4.14*/using namespace std;int main(){Stack s;int val;s.push(1);s.push(2);s.push(3);s.push(4);s.push(5);s.traverse();s.pop(val);cout << "出栈的值为:" << val << endl;system("pause");return 0;}
以上就是栈的基本内容,感谢大家的观看,欢迎转发、点赞、收藏,晚安各位。
