基本概念
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;
}
}
}