PS.更多数据结构知识详见:
八大数据结构
栈的用法
栈的数据结构
ADT 栈
Data
和线性表相同,元素具有相同的数据类型,相邻元素具有前驱和后继关系
Opreation
InitStack():
DestoryStack():
CleraStack():
StackEMpty():
GetTop():
Push(e):
Pop():
StackLength():
基于数组构建栈
数组栈的数据结构
#include<iostream>
using namespace std;
class ArrayStack
{
int len;
int *data;
int ptr;
public:
ArrayStack(int size = 10)
{
ptr = -1;
len = size;
data = new int[len];
}
~ArrayStack()
{
delete[]data;
}
void push(int val) {
if (ptr == len - 1)
return;
ptr++;
data[ptr] = val;
}
void pop()
{
if (ptr == -1)
return;
ptr--;
}
int top()
{
if (ptr == -1)
return -1;
return data[ptr];
}
int size()
{
return ptr + 1;
}
void clear() {
ptr = -1;
}
bool empty()
{
if (ptr == -1)
return true;
return false;
}
};
基于链表实现的栈
链表栈的数据结构
struct LinkList
{
int val;
LinkList* next;
LinkList(int val = -1, LinkList* next = nullptr) :val(val), next(next) {}
};
class LinkStack
{
LinkList* head;
int count;
public:
LinkStack()
{
head = new LinkList(-1, nullptr);
count = 0;
}
~LinkStack()
{
clear();
delete head;
}
void push(int val)
{
head->next = new LinkList(val,head->next);
count++;
}
void pop()
{
if (head->next)
{
LinkList* del = head->next;
head->next = del->next;
delete del;
count--;
}
}
int top()
{
if (count == 0)
return -1;
return head->next->val;
}
int size()
{
return count;
}
void clear()
{
while (head->next)
{
LinkList* del = head->next;
head->next = del->next;
delete del;
}
count = 0;
}
bool empty()
{
return count == 0 ? true : false;
}
};
测试
#include <iostream>
using namespace std;
#include"link.h"
#include"stack.h"
void testArrayStack()
{
cout << "底层使用数组实现的栈" << endl;
ArrayStack* sta = new ArrayStack(6);
sta->push(1);
sta->push(2);
sta->push(3);
cout << "栈顶元素为 :" << sta->top() << endl;
cout << "栈内的元素个数为:" << sta->size() << endl;
cout << endl << endl;
cout << "删除栈顶元素" << endl;
sta->pop();
cout << "栈顶元素为 :" << sta->top() << endl;
cout << "栈内的元素个数为:" << sta->size() << endl;
cout << endl << endl;
cout << "清空栈内元素 " << endl;
sta->clear();
cout << "栈顶元素为 :" << sta->top() << endl;
cout << "栈内的元素个数为:" << sta->size() << endl;
}
void testLinkStack()
{
cout << "底层使用链表实现的栈" << endl;
LinkStack* sta = new LinkStack;
sta->push(1);
sta->push(2);
sta->push(3);
cout << "栈顶元素为 :" << sta->top() << endl;
cout << "栈内的元素个数为:" << sta->size() << endl;
cout << endl << endl;
cout << "删除栈顶元素" << endl;
sta->pop();
cout << "栈顶元素为 :" << sta->top() << endl;
cout << "栈内的元素个数为:" << sta->size() << endl;
cout << endl << endl;
cout << "清空栈内元素 " << endl;
sta->clear();
cout << "栈顶元素为 :" << sta->top() << endl;
cout << "栈内的元素个数为:" << sta->size() << endl;
}
int main()
{
testArrayStack();
cout << endl << endl;
testLinkStack();
}
运行结果
栈的一些应用
1.括号匹配
2.相邻字符串匹配问题
3.逆波兰表达式求值