顺序栈的实现

/***顺序栈的实现***/

#include<iostream.h>
#include<stdlib.h>

//顺序栈定义
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE  100
typedef int Status;
typedef int SElemType;
typedef struct{
	SElemType *base;
	SElemType *top;
	int stacksize;
}SqStack;

//算法3.1 顺序栈的初始化
Status InitStack(SqStack &S)
{// 构造一个空栈 S 
	S.base = new SElemType[MAXSIZE];	//为顺序栈分配一个最大容量为MAXSIZE的数组空间
	if(!S.base)
		exit (OVERFLOW);    	//存储分配失败
	S.top = S.base;
	S.stacksize = MAXSIZE;
	return OK;
}
//算法3.2 顺序栈的入栈
Status Push(SqStack &S,SElemType &e)
{ // 插入元素e为新的栈顶元素
	if(S.top-S.base==S.stacksize)
		return ERROR;	//栈满
	*(S.top++) = e;	//元素e压入栈顶,栈顶指针加1
	return OK;
}
//算法3.3 顺序栈的出栈
Status Pop(SqStack &S,SElemType &e)
{// 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
	if(S.base == S.top)
		return ERROR;//栈空
	e = *(--S.top); //栈顶指针减1,将栈顶元素赋给e
	return OK;
}
//算法3.4 取顺序栈的栈顶元素
Status GetTop(SqStack S,SElemType &e)
{// 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
	if(S.top == S.base)
		return ERROR;
	e = *(S.top-1);//栈顶指针减1,将栈顶元素赋给e
	return OK;
}

int main()
{
	SqStack s;
	SElemType e;
	SElemType t;
	cout<<"进栈元素依次为:"<<endl;
	if(InitStack(s)==OK)
		for(int j=1;j<=12;j++)
		{
			Push(s,j);
			cout<<j<<"  ";
		}
	cout<<endl<<"依次弹出的栈顶元素为:"<<endl;
	while(GetTop(s,e) == OK)
	{
		cout<<e<<"  ";
		Pop(s,t); //这一行不能去掉 
		
	}
	return 0;
}
</pre><pre name="code" class="cpp"><pre name="code" class="cpp">/***顺序栈的实现***/

#include<iostream.h>
#include<stdlib.h>

//顺序栈定义
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE  100
typedef int Status;
typedef int SElemType;
typedef struct{
	SElemType *base;
	SElemType *top;
	int stacksize;
}SqStack;

//算法3.1 顺序栈的初始化
Status InitStack(SqStack &S)
{// 构造一个空栈 S 
	S.base = new SElemType[MAXSIZE];	//为顺序栈分配一个最大容量为MAXSIZE的数组空间
	if(!S.base)
		exit (OVERFLOW);    	//存储分配失败
	S.top = S.base;
	S.stacksize = MAXSIZE;
	return OK;
}
//算法3.2 顺序栈的入栈
Status Push(SqStack &S,SElemType &e)
{ // 插入元素e为新的栈顶元素
	if(S.top-S.base==S.stacksize)
		return ERROR;	//栈满
	*(S.top++) = e;	//元素e压入栈顶,栈顶指针加1
	return OK;
}
//算法3.3 顺序栈的出栈
Status Pop(SqStack &S,SElemType &e)
{// 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
	if(S.base == S.top)
		return ERROR;//栈空
	e = *(--S.top); //栈顶指针减1,将栈顶元素赋给e
	return OK;
}
//算法3.4 取顺序栈的栈顶元素
SElemType GetTop(SqStack S)
{// 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
	if(S.top == S.base)
		return ERROR;
     return *(S.top-1);//栈顶指针减1,将栈顶元素赋给e

}
int main()
{   SqStack s;
     SElemType e;
	cout<<"1.初始化栈"<<endl;
	cout<<"2.入栈"<<endl;
	cout<<"3.出栈"<<endl; 
	 cout<<"4.取栈顶元素"<<endl;
	 cout<<"0.退出"<<endl;
	 int choose=-1;
	 while(choose!=0)
	 {
 		cout<<"请选择:\n";
		 cin>>choose;
		 switch(choose)
		 {
 			case 1:
 			{
			 	if(InitStack(s))
 			     cout<<"顺序栈初始化成功!\n";
			  else
			     cout<<"顺序栈初始化失败!\n";
			  break;   
		    }  
			case 2:
			{
				cout<<"请输入进栈元素个数:";
		        int n;
		        SElemType a;
		        cin>>n;
	            cout<<"进栈元素依次为:\n";
		        for(int i=0;i<n;i++)
		        {
		           cin>>a;
			       Push(s,a);	
    	        } 
    	        break;
			} 
			case 3:
			{
				cout<<"出栈元素依次为:\n";
				
				while(Pop(s,e))
				{
					cout<<e<<" ";
				}
				break;
			}
			case 4: 
			{
				cout<<"栈顶元素为:";
				e=GetTop(s);
				cout<<e<<endl;
				break; 
			}
			case 0:exit(0);
			default:cout<<"无此选项!\n";
 		 } 
 	 } 
} 


 
</pre><pre name="code" class="cpp"><pre name="code" class="cpp">#include <iostream>
using namespace std;
#define MAXSIZE 100
typedef int Selemtype;
typedef int Status;
#define OK 1
#define ERROR 0
#define OVERFLOW -2 
typedef struct{
	Selemtype *top;
	Selemtype *base;
	int stacksize;//栈的最大容量 
}SqStack;
//算法3.1 顺序栈的初始化
Status InitStack(SqStack &S)//构造一个空栈 
{
	S.base=new Selemtype[MAXSIZE];//为顺序栈分配一个最大容量为MAXSIZE的数组空间 
	if(!S.base)
       exit(OVERFLOW);//存储分配失败 
    S.top=S.base;
    S.stacksize=MAXSIZE;
    return OK;
}
//算法3.2 顺序栈的入栈 
Status Push(SqStack &S,Selemtype e)//插入e为新的栈顶元素 
{
	if(S.top-S.base==S.stacksize)
	    return ERROR;//栈满 
	*S.top++=e;//元素e压入栈顶,栈顶指针加1 
	return OK; 
} 
//算法3.3 顺序栈的出栈
Status Pop(SqStack &S,Selemtype &e) 
{
	if(S.top==S.base)  return ERROR;//栈空 
	e=*--S.top;//栈顶指针减1,栈顶元素付给e 
	return OK;
}
//算法3.4 取栈顶元素
Selemtype GetTop(SqStack S)
{
	if(S.top==S.base)  exit(1);
	return *(S.top-1);//栈顶指针减1,返回栈顶元素 
}
int main()
{
	SqStack sa;
	if(InitStack(sa))
    {
    	
		cout<<"顺序栈初始化成功!请输入进栈元素个数:";
		int n;
		Selemtype a;
		cin>>n;
	    cout<<"进栈元素依次为:\n";
		for(int i=0;i<n;i++)
		{
		    cin>>a;
			Push(sa,a);	
		} 
    }
    else
       cout<<"初始化顺序栈失败!\n";
    cout<<"依次弹出的栈顶元素为:\n";
    Selemtype b;
   while(Pop(sa,b))
  {
    	cout<<b<<" ";
    	
  }
    
    cout<<endl;
    return 0;
    
	 
} 
 


 


  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值