一.链式栈节点
1.栈节点的定义
#pragma once
#include<iostream>
class LinkNode
{
public:
int data;
LinkNode* next;
LinkNode();//创建头节点
LinkNode(int val);
};
2.栈节点的初始化
#include "LinkNode.h"
LinkNode::LinkNode()
:next(nullptr)
{
}
LinkNode::LinkNode(int val)
:data(val), next(nullptr)
{
}
二.链式栈的接口
#pragma once
#include"LinkNode.h"
#include<iostream>
using namespace std;
class LinkedStack
{
public:
LinkNode* top;
int size;
public:
LinkedStack();
void push(int val);
int pop();
void print();
bool isEmpty();
int getSize();
int getTop();
int getTopIndex();
};
三.链式栈的基本操作
1.初始化
将栈顶指针设为空指针,栈长为0
LinkedStack::LinkedStack()
:size(0)
{
top = NULL;
}
2.入栈操作
1.栈长自增
2.新元素的next指针指向栈顶
3.将新元素设为栈顶
4.时间复杂度为Θ(1)
void LinkedStack::push(int val)
{
size++;
LinkNode* temp = new LinkNode(val);
temp->next = top;
top = temp;
}
3.出栈操作
1.检验是否栈空
2.栈长自减
3.使用一个暂时指针保留栈顶元素
4.将暂时指针向后移动一位作为栈顶
5.删除暂时指针
6.返回之前保留的栈顶元素
int LinkedStack::pop()
{
if (isEmpty())
cout << "Empty,Stack" << endl;
else
{
size--;
LinkNode* temp = top;
int val = temp->data;
top = temp->next;
delete temp;
return val;
}
}
4.判空
初始化top=-null,判断top是否为空指针
bool LinkedStack::isEmpty()
{
return top==nullptr;
}
5.计算栈长
1.将栈顶指针看作数组下标为1
2.遍历链表直到链表的下一个节点为空节点
3.Temp = Temp->Next;等价于a++
int LinkedStack::getSize()
{
int Size = 0;
LinkNode* temp = top;
while (temp)
{
Size++;
temp = temp->next;
}
return Size;
}
6.打印栈
void LinkedStack::print()
{
LinkNode* temp = top;
int i = 1;
while (temp)
{
cout << "第" << i << "个元素为:" << temp->data << endl;
temp = temp->next;
i++;
}
}