数据结构与算法分析(四)——C++实现栈

基本概念

1.后进先出
2.限制插入和删除只能在一个位置上进行的表
3.两种基本操作:进栈、出栈

应用

1.平衡符号
2.后缀表达式
3.中缀到后缀的转换
4.函数调用
(还没看书上的详细描述。。。)

代码实现

(1)数组实现
1.开辟一个有限大的数组作为栈,利用int型的top去表示栈顶

//stack_array.h
#pragma once
#include "includes.h"
#define N 500
class stack_array
{
public:
	stack_array(void);
	~stack_array(void);
	bool sa_push(string add,string num,string t);
	bool sa_pop();
	void Print_stack_array();
	void Read_file(string filename);
	int sa_top;
	string sa_table[N][3];
};

2.入栈,需要判断是否满栈

/**
 *@name sa_push:入栈
 *@param1 add:入栈数据-地址
 *@param2 num:入栈数据-序号
 *@param3 t:入栈数据-时间
 *@ret:是否入栈成功
**/
bool stack_array::sa_push(string add,string num,string t)
{
	if(sa_top==N-1)
	{
		cout<<"the stack is full"<<endl;
		return false;
	}
	else
	{
		//如果栈没有满则往栈中推入一个数据
		sa_top++;
		sa_table[sa_top][0]=add;
		sa_table[sa_top][1]=num;
		sa_table[sa_top][2]=t;
		return true;
	}
}

3.出栈,需要判断栈是否空了

/**
 *@name sa_pop:出栈
 *@ret:出栈是否成功
**/
bool stack_array::sa_pop()
{
	if(sa_top==-1)
	{
		//此时栈空
		cout<<"the stack is empty"<<endl;
		return false;
	}
	else
	{
		sa_top--;
		return true;
	}
}

4.初始化、打印以及读取文件数据

/**
 *@name stack_array:构造函数,初始化top
**/
stack_array::stack_array(void)
{
	sa_top=-1;
}

/**
 *@name Print_stack_array:打印所有栈中存储的数据
**/
void stack_array::Print_stack_array()
{
	if(sa_top==-1)
	{
		cout<<"the stack is empty"<<endl;
		return;
	}
	else
	{
		cout<<"the number of stack data is "<<sa_top+1<<endl;
		for (int i=sa_top;i>=0;i--)
		{
			//从栈顶开始输出
			cout<<sa_table[i][0]<<" ";
			cout<<sa_table[i][1]<<" ";
			cout<<sa_table[i][2]<<endl;
		}
	}
}

/**
 *@name Read_file:读取文件中的数据,存入栈中
 *@param1 filename:文件名
**/
void stack_array::Read_file(string filename)
{
	ifstream in(filename,ios::in);
	string temp_add;
	string temp_num;
	string temp_t;
	for (int i=0;i<500;i++)
	{
		in>>temp_add;
		in>>temp_num;
		in>>temp_t;
		if(!sa_push(temp_add,temp_num,temp_t))
			return;
	}
}

(2)链表实现
1.利用node*型的top作为栈顶指针

//stack_list.h
#pragma once
#include "includes.h"
class stack_list
{
public:
	stack_list(void);
	~stack_list(void);
	bool sl_push(string add,string num,string t);
	bool sl_pop();
	void Print_stack_list();
	node* sl_top;
};

2.入栈,需要判断栈中是否存在节点,两种情况操作不同

/**
 *@name sa_push:入栈
 *@param1 add:入栈数据-地址
 *@param2 num:入栈数据-序号
 *@param3 t:入栈数据-时间
 *@ret:是否入栈成功
**/
bool stack_list::sl_push(string add,string num,string t)
{
	node* temp=new node;
	temp->address=add;
	temp->number=num;
	temp->time=t;
	if(sl_top==NULL)
	{
		temp->next=NULL;
		//如果栈中无节点 则top直接指向新节点
		sl_top=temp;
	}
	else
	{
		//如果栈中有节点,则新节点指向栈顶节点,栈顶指针指向新节点
		temp->next=sl_top;
		sl_top=temp;
	}
	return true;
}

3.出栈,需要判断栈中是否存在节点

/**
 *@name sa_pop:出栈
 *@ret:出栈是否成功
**/
bool stack_list::sl_pop()
{
	if(sl_top==NULL)
	{
		cout<<"the stack is empty"<<endl;
		return false;
	}
	else
	{
		//不需要考虑只有一个节点,因为此时节点指向空指针
		//故直接将指针指向后一个节点即可
		sl_top=sl_top->next;
		return true;
	}
}

4.初始化以及打印函数,这里在打印时连续迭代,直到i为空指针为止

/**
 *@name stack_array:构造函数,初始化top
**/
stack_list::stack_list(void)
{
	sl_top=NULL;
}

/**
 *@name Print_stack_array:打印所有栈中存储的数据
**/
void stack_list::Print_stack_list()
{
	node *i=sl_top;
	if(sl_top==NULL)
	{
		cout<<"the stack is empty"<<endl;
		return;
	}
	else
	{
		while(i!=NULL)
		{
			cout<<i->address<<" ";
			cout<<i->number<<" ";
			cout<<i->time<<endl;
			i=i->next;
		}
	}
}
发布了99 篇原创文章 · 获赞 29 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_44586750/article/details/102575060