共享栈的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
    评论
以下是用 C 语言实现一个共享的示例代码: ```c #include <stdio.h> #define MAX_SIZE 100 typedef struct { int data[MAX_SIZE]; int top1; // 1的顶指针 int top2; // 2的顶指针 } SharedStack; void initStack(SharedStack *s) { s->top1 = -1; s->top2 = MAX_SIZE; } void push1(SharedStack *s, int value) { if (s->top1 + 1 == s->top2) { printf("Stack Overflow!\n"); return; } s->data[++s->top1] = value; } void push2(SharedStack *s, int value) { if (s->top2 - 1 == s->top1) { printf("Stack Overflow!\n"); return; } s->data[--s->top2] = value; } int pop1(SharedStack *s) { if (s->top1 == -1) { printf("Stack Underflow!\n"); return -1; } return s->data[s->top1--]; } int pop2(SharedStack *s) { if (s->top2 == MAX_SIZE) { printf("Stack Underflow!\n"); return -1; } return s->data[s->top2++]; } int main() { SharedStack stack; initStack(&stack); push1(&stack, 1); push1(&stack, 2); push2(&stack, 3); push2(&stack, 4); printf("%d\n", pop1(&stack)); // Output: 2 printf("%d\n", pop2(&stack)); // Output: 4 return 0; } ``` 上述代码中,我们使用一个结构体 `SharedStack` 来表示共享,其中包含一个数组来存储数据,以及两个指针 `top1` 和 `top2` 分别表示1和2的顶指针。 初始化时,将1的顶指针 `top1` 初始化为 -1,2的顶指针 `top2` 初始化为 `MAX_SIZE`。 通过 `push1` 和 `push2` 函数可以分别向1和2中压入元素。在压入元素之前,会先判断是否已满。 通过 `pop1` 和 `pop2` 函数可以分别从1和2中弹出元素。在弹出元素之前,会先判断是否为空。 在 `main` 函数中,我们展示了一些示例操作,包括压入元素和弹出元素。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值