C语言顺序栈的相关操作

目录

1.结构体设置

2.栈的初始化

3.栈的入栈

4.栈的出栈

5. 栈的遍历

6.测试(输入正数 入栈,输入负数就出栈)


1.结构体设置

typedef int datatype;
typedef struct stack{
	datatype data[N];		//数组
	int top;				//栈顶指针
} stack_t,*pstack_t;

2.栈的初始化

/**
  ***************************************
  *@brief     : 栈的初始化
  *@param   :None
  *@retval  :pstack_t : 成功返回地址
  *                         失败返回NULL
  ***************************************
  */
pstack_t stack_init(void)
{
    // 在堆中开辟空间
    pstack_t p = (pstack_t)malloc(sizeof(stack_t));
    if(p==NULL){  // malloc 出错
        perror("malloc error");
        return NULL;
    }
    
    p->top = -1;  // 栈顶指针设置为-1
    
    return p;
}

3.栈的入栈

/**
  ***************************************
  *@brief     : 栈的入栈
  *@param   :p  栈
  *@param   :d  数据
  *@retval  :int 成功返回0 失败返回-1
  ***************************************
  */
int push(pstack_t p,datatype d)
{
    
    //栈满
    if(p->top==N-1){
        printf("sorry!栈满\n");
        return -1;
    }
    
    p->top++;
    p->data[p->top]=d;
    return 0;
}

4.栈的出栈

/**
  ***************************************
  *@brief     : 栈的出栈
  *@param   :p  栈
  *@param   :d  数据
  *@retval  :int 成功返回0 失败返回-1
  ***************************************
  */
int pop(pstack_t p,datatype *d)
{
    if(p->top==-1){
        printf("sorry!栈空\n");
        return -1;
    }
    
    *d = p->data[p->top];
    p->top--;
    return 0;
}

5. 栈的遍历


/**
  ***************************************
  *@brief     : 栈的遍历
  *@param   :p  栈
  *@param   :d  数据
  *@retval  :int 成功返回0 失败返回-1
  ***************************************
  */
void display(pstack_t p)
{
    printf("栈的遍历:\n");
    int i;
    for(i=p->top;i>=0;i--)
        printf("| %d |\n",p->data[i]);
        
    printf("\n");
    
}

6.测试(输入正数 入栈,输入负数就出栈)

int main(void)
{
	pstack_t p = stack_init();
	if(p==NULL)
		return -1;
	printf("%p\n",p);
	
	//输入正数 入栈,输入负数就出栈
	datatype d;
	int ret;
	while(1)
	{
		ret = scanf("%d",&d);
		if(ret==0)
			break;
		
		if(d>0){
			push(p,d);
		}else if(d<0){
			if(!pop(p,&d))
				printf("%d出栈了\n",d);
		}
		
		display(p);
	}
	
	return 0;
	
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值