双向栈 可实现队列

#include <stdio.h>  
#define MaxStackSize 100  
typedef int DataType;  
int len,x;  
  
typedef struct  
{  
    DataType stack[MaxStackSize];         //栈的申明定义      
    int top1;  
    int top2;  
}SeqStack; 

void StackInitiate(SeqStack *S)      //栈的初始化操作     
{  
    S->top1=0;                 //不舍弃数组的存储单元  ---第二种方法  
    S->top2=MaxStackSize-1;  
} 
  
int StackNotEmpty(SeqStack S,DataType where)     //判空        
{  
    if(where==1)  
    {  
        if(S.top1<=0)       //判空   
            return 0;  
        return 1;  
    }  
    else  
    {  
        if(S.top2>=MaxStackSize-1)  
            return 0;  
        return 1;   //不符合就未空  
    }  
}  
  
int StackPush(SeqStack *S,DataType x,DataType where)         //入栈    
{  
    if(S->top1+1==S->top2)              //判满  
    {  
        printf("堆栈已满无法插入!\n");  
        return 0;  
    }  
    else                                      //未满则进行插入操作     
    {  
        if(where==1)  
        {     
            S->stack[S->top1]=x;  
            S->top1++;  
        }  
        else                                  //选择插入的栈号进行插入操作    
        {  
            S->stack[S->top2]=x;  
            S->top2--;  
        }  
    }  
    return 1;  
}  
  
int StackPop(SeqStack *S,DataType *d,DataType where)        //出栈            
{  
    if(where==1)  
    {  
        if(S->top1<=0)  
        {  
            printf("1号栈是空的,无数据元素出栈!\n");  
            return 0;  
        }  
        S->top1--;  
        *d=S->stack[S->top1];  
    }  
    else  
    {  
        if(S->top2>=MaxStackSize-1)  
        {  
            printf("2号栈是空的,无数据元素出栈!\n");  
            return 0;  
        }  
        S->top2++;  
        *d=S->stack[S->top2];  
    }  
    return 1;  
}  
  
int StackTop(SeqStack S,DataType *d,DataType where)        //返回栈顶元素     
{  
    if(where==1)  
    {  
        if(len<=0)  
        {  
            printf("1号栈已空无数据元素出栈!\n");  
            return 0;  
        }  
        *d=S.stack[len-1];  
    }  
    else  
    {  
        if(len>MaxStackSize-1)  
        {  
            printf("2号栈已空无数据元素出栈!\n");  
            return 0;  
        }  
        *d=S.stack[len+1];  
    }  
    return 1;  
}                       //使用时忘记保存头文件代码会造成什么错误   
  
void StackPrint(SeqStack S,DataType where)         //打印函数  
{  
    if(where==1)  
    {  
        len=S.top1;  
        if(len<=0)  
        {  
            printf("1号栈已空,无元素输出.\n");  
            return ;  
        }  
        printf("1号栈内元素如下:\n");  
        while(len>0)  
        {  
            StackTop(S,&x,1);  
            printf("%d ",x);  
            len--;  
        }  
        printf("\n");  
        return ;  
    }  
    else  
    {  
        len=S.top2;  
        if(len>=MaxStackSize-1)  
        {  
            printf("2号栈已空无数据元素出栈!\n");  
            return ;  
        }  
        printf("2号栈内元素如下:\n");  
        while(len<MaxStackSize-1)  
        {  
            StackTop(S,&x,2);  
            printf("%d ",x);  
            len++;  
        }  
        printf("\n");  
        return ;  
    }  
    return ;  
} 

int main()  
{  
    SeqStack myStack;  
    int i,n,m;  
    StackInitiate(&myStack);  
    for(i=0;i<10;i++)              
        StackPush(&myStack,i+1,1);        
    StackPrint(myStack,1);  
    StackPrint(myStack,2);  
    printf("请输入你要插入的元素以及要插入的几号栈:\n");  
    scanf("%d%d",&n,&m);  
    StackPush(&myStack,n,m);  
    printf("插入后得到如下序列:\n");  
    StackPrint(myStack,1);  
    StackPrint(myStack,2);  
    StackPop(&myStack,&x,m);  
    StackTop(myStack,&x,m);  
    printf("删除后得到如下序列:\n");  
    StackPrint(myStack,1);  
    StackPrint(myStack,2);  
    return 0;  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值