C++数据结构X篇_08_C++实现栈的顺序存储与链式存储

本篇参考C++实现栈的顺序存储与链式存储整理,先搞懂结构框架,后期根据视频利用c对内容实现,也可以对c有更高的提升。

栈是一种特殊的数据结构,栈中数据先进后出,且栈中数据只能从头部出栈,能直接访问的数据也仅为栈的头部数据,要想访问下面的数据则需要将前面的数据逐个出栈后才可访问。下面通过一个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;
}

运行结果为:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Dasis/article/details/131649587