共享栈的C语言实现

共享栈:所谓共享栈就是为了节省空间,让两个栈共享一片连续的存储空间,两个栈从这片连续的共享空间的两端向中间扩充自己的存储空间,设这片存储空间的大小为maxSize,采用栈顶指针始终指向当前栈顶元素的方式来实现共享栈,那么初始栈空时,两个栈的栈顶指针的值分别为:top1==-1,top2==MaxSize

对共享栈进行入栈操作和出栈操作很简单,关键在于要记住——“入栈判满,出栈判空” 

共享栈的C语言实现

  1. 共享栈数据结构定义

    //假设栈的实现方式采用,栈顶指针始终指向当前的栈顶元素,也就是说判断栈空的条件为top==-1
    typedef struct ShareStack {
    	ElemType data[MaxSize];
    	int top[2];                    //存储两个栈的栈顶指针
    }*shareStack,St;

     

  2. 对共享栈进行初始化操作
    //对共享栈进行初始化操作
    void Initiate(shareStack Sta)
    {
    	memset(Sta->data, 0, sizeof(Sta->data));   //将共享栈的数据元素全部初始化为0
    	(Sta->top)[0] = -1;
    	(Sta->top)[1] = MaxSize;
    }
    

                

  3. 对共享栈进行入栈操作 

    
    //入栈操作
    void Push(shareStack Sta,ElemType x)
    {
    	//top[0]表示第一个栈的栈顶指针,初始时top[0]=-1,top[1]表示第二个栈的栈顶指针,初始时top[1]=MaxSize
    	int stack;        //记录当前需要对第几个栈进行入栈操作
    	printf("请输入你要进行入栈操作的那个栈的序号,合法的输入为0,1,分别表示第一个栈和第二个栈\n");
    	scanf("%d", &stack);
    
    	if (Sta->top[0] + 1 == Sta->top[1])
    	{
    		printf("栈满,无法进行入栈操作\n");
    		return;
    	}
    
    	switch (stack)
    	{
    	case 0:
    		//对栈1进行入栈操作
    		Sta->data[++(Sta->top[0])] = x;
    		break;
    	case 1:
    		//对栈2进行入栈操作
    		Sta->data[--(Sta->top[1])] = x;
    	}
    }
    

                      

  4. 对共享栈进行出栈操作

    //出栈操作
    void Pop(shareStack Sta,ElemType &x)
    {
    	int stack;           //用于记录你所需要进行出栈操作的栈的序号
    	printf("请输入你要进行出栈操作的那个栈的序号,合法的输入为0,1,分别表示第一个栈和第二个栈\n");
    	scanf("%d", &stack);
    
    	switch (stack)
    	{
    	case 0:
    		if (Sta->top[0] == -1)
    		{
    			printf("栈空,无法进行出栈操作\n");
    			return;
    		}
    		x = Sta->data[(Sta->top[0])--];
    		break;
    
    	case 1:
    		if (Sta->top[1] == MaxSize)
    		{
    			printf("栈空,无法进行出栈操作\n");
    			return;
    		}
    		x = Sta->data[(Sta->top[1])++];
    	}
    }

 用switch语句代替if-else分支语句使程序更简洁

  • 18
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值