本篇参考C++实现栈的顺序存储与链式存储整理,先搞懂结构框架,后期根据视频利用c对内容实现,也可以对c有更高的提升。
文章目录
- 1. 栈的顺序存储
- 2. 栈的链式存储
栈是一种特殊的数据结构,栈中数据先进后出,且栈中数据只能从头部出栈,能直接访问的数据也仅为栈的头部数据,要想访问下面的数据则需要将前面的数据逐个出栈后才可访问。下面通过一个word撤销的案例来解释:
我们用word写paper时,首先需要创建一个空白文档(即一个空栈),然后对这个空白文档进行一系列操作每个操作都是一个新的version,即数据存储压栈的操作。但是paper写完后(version4),我们发现写的paper有问题需要修改,想要回到version1,这就用到了撤销的操作。但是因为word只能直接访问最近的version,我们没法直接回到version1,需要先回到version3再回到version2最后才能回到version1,这种访问方式即出栈访问top。
栈的基本理论就介绍到这,下面附上栈的两种存储结构的实现代码。
1. 栈的顺序存储
#include <iostream>
using namespace std;
const int max_size=1024;
//创建栈
class seqstack
{
public:
void* data[max_size]; //可以指向任何类型数据的指针
int size;
};
//初始化栈
seqstack* init_seqstack()
{
seqstack* stack =new seqstack;
for (int i = 0; i < max_size; i++)
{
stack->data[i]=NULL;
}
stack->size=0;
return stack;
}
//入栈操作
void push_seqstack(seqstack* stack,void* data)
{
if (stack->size==max_size)
{
cout<<"数据已满"<<endl;
return;
}
stack->data[stack->size]=data;
stack->size++;
}
//返回栈顶元素
void* top_seq_stack(seqstack* stack)
{
return stack->data[stack->size-1];
}
//出栈
void pop_seqstack(seqstack* stack)
{
stack->data[stack->size-1]=NULL;
stack->size--;
}
int main()
{
//创建栈
seqstack* stack=init_seqstack();
//创建数据
int num[9]={1,2,3,4,5,6,7,8,9};
//数据入栈
for (int i = 0; i < 9; i++)
{
cout<<"第"<<i+1<<"个入栈数据为:"<<num[i]<<endl;
push_seqstack(stack,&num[i]);
}
cout<<endl;
//逐个出栈并访问
for (int i = 0; i < 9; i++)
{
cout<<"第"<<i+1<<"个出栈数据为:"<<*(int *)(top_seq_stack(stack))<<endl; //将出栈的地址强转成int*再解指针
pop_seqstack(stack);
}
system("pause");
return 0;
}
运行结果:
2. 栈的链式存储
#include <iostream>
#include <string>
using namespace std;
//节点
class linknode
{
public:
linknode* next;
};
//自定义数据
class my_data
{
public:
linknode* node;
char data;
};
//链式栈
class linkstack
{
public:
linknode head;
int size;
};
//初始化栈
linkstack* init_linkstack()
{
linkstack* stack=new linkstack;
stack->head.next=NULL;
stack->size=0;
return stack;
}
//入栈
void push_linkstack(linkstack* stack,linknode* data)
{
data->next=stack->head.next;
stack->head.next=data;
stack->size++;
}
//出栈
void pop_linkstack(linkstack* stack)
{
stack->head.next=stack->head.next->next;
stack->size--;
}
//返回栈顶元素
linknode* top_linkstack(linkstack* stack)
{
return stack->head.next;
}
int main()
{
//创建空栈
linkstack* stack=init_linkstack();
//创建数据
string str="ABCDEFGHI";
my_data data[9];
for (int i = 0; i < str.size(); i++)
{
data[i].data=str[i];
data[i].node=NULL;
}
//入栈
for (int i = 0; i < str.size(); i++)
{
cout<<"第"<<i+1<<"个元素入栈:"<<str[i]<<endl;
push_linkstack(stack,(linknode*)&data[i]);
}
cout<<endl;
//出栈
for (int i = 0; i < 9; i++)
{
cout<<"第"<<i+1<<"个元素出栈:"<<(((my_data*)top_linkstack(stack))->data)<<endl;
pop_linkstack(stack);
}
system("pause");
return 0;
}
运行结果为: