栈的简单实现(顺序栈、链栈)

顺序栈的简单实现

#include<iostream>

#define MAXSIZE 100
 
#define TRUE  1
#define FALSE 0
#define OK    1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW   -2

using namespace std;

typedef int Status;

typedef struct
{
	int *base;
	int *top;
	int stacksize;
}SqStack;


Status InitStack(SqStack &S)
{//初始化 
    S.base=new int[MAXSIZE];   //为顺序栈动态分配一个最大容量
    if(!S.base) exit(OVERFLOW);      //存储分配失败
    S.top=S.base;                    //空栈
    S.stacksize=MAXSIZE;             //stacksize置为栈的最大容量MAXSIZE
    return OK;
 }   

Status Push(SqStack &S,int e)
{//入栈 
   if(S.top-S.base==S.stacksize)  return ERROR;    //栈满
   *S.top++=e;                                     //元素e压入栈顶,栈顶指针加1
   return OK;
}   

Status Pop(SqStack &S,int &e)
{//出栈 
     if(S.top==S.base)   return ERROR;   //栈空
     e=*--S.top;    //栈顶指针减一,将栈顶元素赋给e
     return OK;
}     

Status GetTop(SqStack S)
{//取栈顶元素 
   if(S.top!=S.base)       //栈非空
   return *(S.top-1);      //返回栈顶元素的值,栈顶指针不变
}   

Status StackEmpty(SqStack S)
{//判断是否为空 
	if(S.base==S.top)
	 return OK;
	else
	 return ERROR; 
}

Status StackLength(SqStack S)
{//求顺序栈长度 
	return S.top-S.base;
}

void ClearStack(SqStack &S)
{//清空 
	if(S.base)
	S.top=S.base;
}

void DestroyStack(SqStack &S)
{//销毁 
	if(S.base)
	{
		delete S.base;
		S.stacksize=0;
		S.base=S.top=NULL;
	}
}

int main() 
{
	SqStack S;
	cout <<"简单实现顺序栈:"<<endl;
	cout<<"初始化一个空栈:"<<endl; 
	if(InitStack(S))
	cout <<"初始化成功!"<<endl<<endl;
	else
	cout <<"初始化失败"<<endl<<endl;
	
	cout<<"输入你想要几个元素入栈:";
	int n,e;
	cin >>n;
	cout<<endl;
	cout <<"请输入这几个元素:";
	for(int i=0;i<n;i++)
	{
	   cin >>e;
	   Push(S,e);
	} 
	cout <<endl;
	
	 cout<<"此时顺序栈内元素个数为:"<<StackLength(S)<<endl<<endl;
	
	cout<<"删除栈顶元素:"<<endl;
	if(Pop(S,e)) 
	cout<<"删除成功!"<<"此元素为:"<<e<<endl<<endl;
	else
	cout<<"删除失败!"<<endl<<endl; 
	
	if(!StackEmpty(S))
	cout<<"栈非空!"<<endl<<endl;
	else
	cout<<"栈空!"<<endl<<endl; 
	
	cout<<"此时栈内元素个数为:"<<StackLength(S)<<endl<<endl;
	
	 cout<<"取栈顶元素:"<<GetTop(S)<<endl<<endl;
	 
	 cout<<"清空顺序栈:"<<endl;
	 ClearStack(S);
	 cout<<"此时顺序栈内元素个数为:"<<StackLength(S)<<endl<<endl;
	 
	 cout<<"销毁顺序栈:"<<endl;
	 DestroyStack(S);
	 cout<<"顺序栈已销毁";
	 
	 return 0;	
}

在这里插入图片描述


链栈的简单实现

#include<iostream>

#define MAXSIZE 100
 
#define TRUE  1
#define FALSE 0
#define OK    1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW   -2

using namespace std;

typedef int Status;

typedef struct StackNode
{
	int data;
	struct StackNode *next;
}StackNode,*LinkStack;

Status InitStack(LinkStack &S)
{//初始化 
    S=NULL;
    return OK;
}    

Status Push(LinkStack &S,int e)
{//入栈 
   LinkStack p;
   p=new StackNode;    //生成新结点
   p->data=e;          //将新结点数据域置为e
   p->next=S;          //将新结点插入栈顶
   S=p;                //修改栈顶指针为p
   return OK;
}   
   
Status Pop(LinkStack &S,int &e)
{//出栈 
    LinkStack p;
    if(S==NULL)   return ERROR;   //栈空
    e=S->data;           //将栈顶元素赋给e
    p=S;                 //用p临时保存栈顶元素空间,以备释放
    S=S->next;           //修改栈顶指针
    delete p;            //释放原栈顶元素的空间
    return OK;
}    

Status GetTop(LinkStack S)
{//取栈顶元素 
   if(S!=NULL)        //栈非空
      return S->data; //返回栈顶元素的值,栈顶指针不变
} 

Status LenthStack(LinkStack S)
{//栈内元素个数 
    int len=0;
    StackNode *p=S;
    while(p!=NULL)
    {
    	p=p->next;
    	len++;
	}
	return len;
}


Status StackEmpty(LinkStack S)
{//判断是否为空 
	if(S==NULL)
	 return OK;
	else
	return ERROR; 
}     

void ClearStack(LinkStack &S)
{//清空 
	if(S) S=NULL;
}

void DestroyStack(LinkStack &S)
{//销毁链栈 
    LinkStack q;
	while(S)
	{
		q=S->next;
		delete S;
		S=q;
	}
} 

int main()
{
	LinkStack S;
	cout <<"链栈的简单实现:"<<endl; 
	cout<<"初始化一个链栈:"<<endl;
	if(InitStack(S))
	cout <<"初始化成功!"<<endl<<endl;
	else
	cout <<"初始化失败!"<<endl<<endl;
	
	cout<<"请输入你想要几个元素入栈:";
	int n,x,e;
	cin >> n;
	cout<<endl<<"输入这几个元素:";
	for(int i=1;i<=n;i++)
	{
		cin>>x;
		Push(S,x);	
	}
	cout<<endl;
	
	cout<<"此时栈内元素个数为:"<< LenthStack(S)<<endl<<endl;
	
	cout<<"删除栈顶元素:"<<endl;
	if(Pop(S,e))
	cout<<"删除成功!"<<endl<<"此元素为:"<<e<<endl<<endl; 
	else
	cout<<"删除失败!"<<endl<<endl;
	
	if(!StackEmpty(S))
	cout <<"栈非空!"<<endl<<endl;
	else
	cout<<"栈空!"<<endl<<endl; 
	
	cout<<"此时栈内元素个数为:"<< LenthStack(S)<<endl<<endl;
	
	cout<<"取栈顶元素:"<<GetTop(S)<<endl<<endl;
	
	cout<<"清空链栈:"<<endl;
	ClearStack(S);
	cout<<"已清除!"<<endl;
	cout<<"此时栈内元素个数为:";
	cout<<LenthStack(S)<<endl<<endl;
	
	cout<<"销毁链栈:"<<endl;
	DestroyStack(S);
	cout<<"已销毁!";
	return 0;	
}

在这里插入图片描述

发布了33 篇原创文章 · 获赞 81 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/wmy0217_/article/details/104195268