C语言数据结构——在一个数组中实现两个堆栈

直接上代码:

#include <stdio.h>
#include <stdlib.h>

#define ERROR 1e8
typedef int ElementType;
typedef enum { push, pop, end } Operation;
typedef enum { false, true } bool;
typedef int Position;
struct SNode {
    ElementType *Data;    //虽然是指针类型可以当作数组用
    Position Top1, Top2;  //实现动态定义数组大小
    int MaxSize;
};
typedef struct SNode *Stack;

Stack CreateStack( int MaxSize );
bool Push( Stack S, ElementType X, int Tag );
ElementType Pop( Stack S, int Tag );

Operation GetOp(); 
void PrintStack( Stack S, int Tag ); 

int main()
{
    int N, Tag, X;
    Stack S;
    int done = 0;

    scanf("%d", &N);
    S = CreateStack(N);
    while ( !done ) {
        switch( GetOp() ) {
        case push: 
            scanf("%d %d", &Tag, &X);
            if (!Push(S, X, Tag)) printf("Stack %d is Full!\n", Tag);
            break;
        case pop:
            scanf("%d", &Tag);
            X = Pop(S, Tag);
            if ( X==ERROR ) printf("Stack %d is Empty!\n", Tag);
            break;
        case end:
            PrintStack(S, 1);
            PrintStack(S, 2);
            done = 1;
            break;
        }
    }
    return 0;
}


Operation GetOp()   //操作方式
{
    char ch[10];
    scanf("%s",ch);
    switch (ch[1])
    {
    case('u'):return push;
    case('o'):return pop;
    case('n'):return end;
    }
}
void PrintStack( Stack S, int Tag )  //输出栈
{
    
    if(Tag==1)
    {
        printf("Pop from Stack 1:");
        while(S->Top1!=-1)
            {printf("%d ",S->Data[(S->Top1)--]);}
        printf("\n");
    }
    else
    {
        printf("Pop from Stack 2:");
        while(S->Top2!=S->MaxSize)
            {printf("%d ",S->Data[(S->Top2)++]);}
    }
}

Stack CreateStack( int MaxSize )    //创建栈
{
    Stack S;
    S=(Stack)malloc(sizeof(struct SNode));  //S为指针类型,若没有为其分配空间则无法进行下面的分配空间和赋值操作
    S->Data=(int*)malloc(4*MaxSize);
    S->MaxSize=MaxSize;
    S->Top1=-1;
    S->Top2=MaxSize;
    return S;
}
bool Push( Stack S, ElementType X, int Tag )  //入栈
{
    if(S->Top2-S->Top1==1)
    {printf("Stack Full\n");    return false;}
    if(Tag==1)
        S->Data[++(S->Top1)]=X;
    else
        S->Data[--(S->Top2)]=X;
    return true;
}
ElementType Pop( Stack S, int Tag )   //出栈
{
    if(Tag==1)
    {
        if(S->Top1==-1)
        {printf("Stack 1 Empty\n");    return ERROR;}
        else
            return S->Data[(S->Top1)--];
    }
    else
    {
        if(S->Top2==S->MaxSize)
        {printf("Stack 2 Empty\n");    return ERROR;}
        else
            return S->Data[(S->Top2)++];
    }
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用数组实现两个堆栈C语言程序: ```c #include <stdio.h> #define STACK_SIZE 10 int stack[STACK_SIZE]; int top1 = -1; int top2 = STACK_SIZE; void push1(int x) { if (top1 < top2 - 1) { stack[++top1] = x; } else { printf("Stack 1 overflow\n"); } } void push2(int x) { if (top1 < top2 - 1) { stack[--top2] = x; } else { printf("Stack 2 overflow\n"); } } int pop1() { if (top1 == -1) { printf("Stack 1 underflow\n"); return -1; } else { return stack[top1--]; } } int pop2() { if (top2 == STACK_SIZE) { printf("Stack 2 underflow\n"); return -1; } else { return stack[top2++]; } } int main() { push1(1); push1(2); push1(3); push2(4); push2(5); push2(6); printf("Stack 1: "); while (top1 != -1) { printf("%d ", pop1()); } printf("\n"); printf("Stack 2: "); while (top2 != STACK_SIZE) { printf("%d ", pop2()); } printf("\n"); return 0; } ``` 在这个程序中,我们使用一个数组来实现两个堆栈。我们将数组从中间分开,将第一个堆栈的顶部指针指向数组的左侧,将第二个堆栈的顶部指针指向数组的右侧。然后,我们分别实现了push1、push2、pop1和pop2函数来操作这两个堆栈。在push1和pop1函数中,我们使用top1来表示第一个堆栈的顶部指针,在push2和pop2函数中,我们使用top2来表示第二个堆栈的顶部指针。当堆栈满时,我们会输出Stack 1/2 overflow,当堆栈为空时,我们会输出Stack 1/2 underflow。最后,我们在main函数中测试了这两个堆栈的push和pop操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值