数据结构之栈的顺序存储的实现

目录

顺序存储

定义基本数据结构

初始化

入栈

出栈

判栈是否为空

把栈置空

获取栈顶元素

头文件

源文件

运行结果

运行结果分析


FILO,即先进后出,类似我们去取一摞碗,我们是不是从最上面的那个碗开始取,而我们用完洗净后放回去的第一个碗被最后拿了出来,但是最后放进去的被最先拿了出来。

  • 顺序存储

顺序存储结构的主要优点是节省存储空间,因为分配给数据的存储单元全用存放结点的数据(不考虑c/c++语言中数组需指定大小的情况),结点之间的逻辑关系没有占用额外的存储空间。采用这种方法时,可实现对结点的随机存取,即每一个结点对应一个序号,由该序号可以直接计算出来结点的存储地址。但顺序存储方法的主要缺点是不便于修改,对结点的插入、删除运算时,可能要移动一系列的结点。

优点:随机存取表中元素、储存密度大。

缺点:插入和删除操作需要移动元素。

 

  • 定义基本数据结构

    typedef char ElemetType;        //这里的char的数据类型可以根据自己需要设置
    const int   Max_dataSize = 512; //定义数组的大小,用define也可以,但在c++中不提倡这么写
    typedef struct Dstack           //定义栈的结构体
    {
    	ElemetType Data[Max_dataSize];
    	int   top;
    }st_stack;
  • 初始化

    void Init(st_stack* s_ptr)
    {
        if (NULL == s_ptr)
    	{
    		exit(0);
    	}
    
    	s_ptr->top = -1;  //栈空,top = -1
    }
  • 入栈

    void Push(st_stack* s_ptr, ElemetType data)
    {
        if (NULL == s_ptr)
    	{
    		exit(0);
    	}
    
    	if (Max_dataSize == s_ptr->top)  //判栈是否满
    	{
    		cout << "栈满" << endl;
    		exit(0);
    	}
    		
    
    	s_ptr->Data[++(s_ptr->top)] = data;  //依次入栈
    }
  • 出栈

    void Pop(st_stack* s_ptr)
    {
        if (NULL == s_ptr)
    	{
    		exit(0);
    	}
    
    	if (-1 == s_ptr->top)     //判空
    	{
    		cout << "栈空" << endl;
    		exit(0);
    	}
    		
    	while (s_ptr->top != -1)
    	{
    		cout << s_ptr->Data[(s_ptr->top)--] << endl;   //栈的输出元素
    	}
    	
    }
  • 判栈是否为空

    bool IsEmpty(st_stack* s_ptr)
    {
    	if (NULL == s_ptr)
    	{
    		exit(0);
    	}
    
    	if (-1 == s_ptr->top)  //判空
    	{
    		return true;
    	}
    	else
    		return false;
    }
  • 把栈置空

    bool SetEmpty(st_stack* s_ptr)
    {
    	if (NULL == s_ptr)
    	{
    		exit(0);
    	}
    
    	while (s_ptr->top != -1)
    	{
    		if (-1 == s_ptr->top)
    		{
    			cout << "栈空" << endl;
    
    		}
    			
    
    		s_ptr->Data[s_ptr->top] = -1;
    		s_ptr->top--;
    	}
    	if (-1 == s_ptr->top)
    	{
    		return true;
    	}
    	else
    		return false;
    }
  • 获取栈顶元素

    ElemetType GetTop(st_stack* s_ptr)
    {
    	if (NULL == s_ptr)
    	{
    		exit(0);
    	}
    
    	return s_ptr->Data[s_ptr->top];
    }
  • 头文件

    #ifndef __SATCK_H__  //防止头文件重复包含
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    typedef char ElemetType;
    const int   Max_dataSize = 512;
    typedef struct Dstack
    {
    	ElemetType Data[Max_dataSize];
    	int   top;
    }st_stack;
    void Init(st_stack* s_ptr);
    void Push(st_stack* s_ptr, ElemetType data);
    void Pop(st_stack* s_ptr);
    ElemetType GetTop(st_stack* s_ptr);
    bool SetEmpty(st_stack* s_ptr);
    
    #endif // !__SATCK_H__
    
    
    
  • 源文件

    #include "stack.h"
    
    void Init(st_stack* s_ptr)
    {
    	if (NULL == s_ptr)
    	{
    		exit(0);
    	}
    	s_ptr->top = -1;
    }
    
    bool IsEmpty(st_stack* s_ptr)
    {
    	if (NULL == s_ptr)
    	{
    		exit(0);
    	}
    
    	if (-1 == s_ptr->top)
    	{
    		return true;
    	}
    	else
    		return false;
    }
    
    void Push(st_stack* s_ptr, ElemetType data)
    {
    	if (NULL == s_ptr)
    	{
    		exit(0);
    	}
    	if (Max_dataSize == s_ptr->top)
    	{
    		cout << "栈满" << endl;
    		exit(0);
    	}
    		
    
    	s_ptr->Data[++(s_ptr->top)] = data;
    }
    void Pop(st_stack* s_ptr)
    {
    	if (NULL == s_ptr)
    	{
    		exit(0);
    	}
    
    	if (-1 == s_ptr->top)
    	{
    		cout << "栈空" << endl;
    		exit(0);
    	}
    		
    	while (s_ptr->top != -1)
    	{
    		cout << s_ptr->Data[(s_ptr->top)--] << endl;
    	}
    	
    }
    ElemetType GetTop(st_stack* s_ptr)
    {
    	if (NULL == s_ptr)
    	{
    		exit(0);
    	}
    
    	return s_ptr->Data[s_ptr->top];
    }
    bool SetEmpty(st_stack* s_ptr)
    {
    	if (NULL == s_ptr)
    	{
    		exit(0);
    	}
    
    	while (s_ptr->top != -1)
    	{
    		if (-1 == s_ptr->top)
    		{
    			cout << "栈空" << endl;
    
    		}
    			
    
    		s_ptr->Data[s_ptr->top] = -1;
    		s_ptr->top--;
    	}
    	if (-1 == s_ptr->top)
    	{
    		return true;
    	}
    	else
    		return false;
    }
    void test()
    {
    	ElemetType  val = -1;
    	st_stack* arr = new st_stack;
    	Init(arr);
    
    
    	if (IsEmpty(arr))
    	{
    		cout << "栈空" << endl;
    	}
    	else
    	{
    		cout << "栈不为空" << endl;
    	}
    	
    
    	Push(arr, 'A');
    	Push(arr, 'B');
    	Push(arr, 'C');
    	Push(arr, 'D');
    
    
    	if (IsEmpty(arr))
    	{
    		cout << "栈空" << endl;
    	}
    	else
    		cout << "栈不为空" << endl;
    
    	
    
    	val = GetTop(arr);
    	cout << "栈顶元素为:" << val << endl;
    	
    	Pop(arr);
    
    	if (SetEmpty(arr))
    	{
    		cout << "置空成功" << endl;
    	}
    	else
    		cout << "置空失败" << endl;
    
    	if (IsEmpty(arr))
    	{
    		cout << "栈空" << endl;
    	}
    	else
    		cout << "栈不为空" << endl;
    
    }
    
    
    int main(int argc, char** argv)
    {
    	test();
    
    	system("pause");
    	return 0;
    }
  • 运行结果

  • 运行结果分析

  1. 第一次判断为空,只是初始化为push;
  2. push之后栈不为空;(入栈顺序ABCD)
  3. 获取栈顶元素;
  4. 出栈;
  5. 把栈置空;
  6. 判断栈是否为空。

注:如有不足及需要改进的地方,敬请指正,谢谢!

发布了47 篇原创文章 · 获赞 37 · 访问量 3695

猜你喜欢

转载自blog.csdn.net/qq_44045338/article/details/104888373