顺序栈及链栈常用方法

本文介绍了顺序栈和链栈的基本操作,包括存储结构定义、初始化、判空、获取栈顶元素、入栈、出栈、清空栈、销毁栈以及栈的遍历。对于顺序栈,还涉及获取栈深度;对于链栈,特别讨论了取栈顶结点的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

顺序栈

存储结构定义

typedef int ElemType;

typedef enum Status{
    ERROR = 0,OK = 1
}Status;

typedef struct SqStack{
       ElemType	*elem;
       int top;      //用于栈顶指针
       int size;     // 最大大小
}SqStack;

初始化栈

//顺序栈(基于数组的)
Status initStack(SqStack *s,int sizes)  //初始化
{   s->elem = (ElemType *)malloc(sizes * sizeof(ElemType));
	    if (s->elem == NULL) {
        return ERROR;
    }
    s->top  = -1;
    s->size = sizes;
    t = 1;                          //表示已经初始化
    return OK;
}

判空

Status isEmptyStack(SqStack *s){
   return ( s->top == -1 ? OK : ERROR);
}

取得栈顶元素

Status getTopStack(SqStack *s,ElemType *e){
    if (s == NULL || s->top == -1) {
        return ERROR;
    } else {
        *e = s->elem[s->top];
    }
    return OK;
}

清空栈

Status clearStack(SqStack *s)  {
	s->top = -1;
	return OK;
}

销毁栈

Status destroyStack(SqStack *s){
    if (s == NULL) {
        return ERROR;
    }
    free(s->elem);
    t = 0;        //标记栈已经不存在
    return OK;
}

获取栈深度

Status stackLength(SqStack *s,int *length){
   if(s == NULL){
   	 *length  = 0;
   	 return ERROR;
   } else {
   	  *length = s->top +1;
   }
}

入栈

Status pushStack(SqStack *s,ElemType datas){ 
     if (s == NULL || s->top > s->size) {
        return ERROR;
    }
    s->top++;
    s->elem[s->top] = datas;
    return OK;
}

出栈

//出栈,并用datas返回其值
Status popStack(SqStack *s,ElemType *datas){
     if (s == NULL || s->top == -1) {
        return ERROR;
    }
    *datas = s->elem[s->top];
    s->top--;
    return OK;
}

遍历栈

void printStack(SqStack *s) {      
	int l = s->top;
	printf("-------该栈为:\n");
	while(l != -1 ){
		printf("%d->",s->elem[l]);
		l--;
	}
}

 


链栈

存储结构定义

typedef int ElemType;

typedef enum Status{
    ERROR = 0,OK = 1
}Status;

typedef  struct StackNode{
	ElemType data;
	struct StackNode *next;
}StackNode, *LinkStackPtr;

typedef  struct  LinkStack{
	LinkStackPtr top;	  //栈顶指针
	int	count;            //栈中元素个数
}LinkStack;

 初始化链栈

Status initLStack(LinkStack *s)   //初始化
{   
    s->top = NULL;           //保证其为空栈 
    s->count = 0; 
    t = 1;                 //标记已经初始化 
    return OK; 
}

判空

Status isEmptyLStack(LinkStack *s){
      return (s->top == NULL? OK : ERROR);
}

取栈顶结点

Status getTopLStack(LinkStack *s,ElemType *e){
     if (isEmptyLStack(s)) {
        return ERROR;
     }
     *e = s->top->data;
      return OK;
}

入栈

// 类似链表的插入操作 
Status pushLStack(LinkStack *s,ElemType datas){
   LinkStackPtr p = (StackNode *)malloc(sizeof(StackNode));
    if(p == NULL){
    	return ERROR;
	} else {
		p->data = datas;
		p->next = s->top;
		s->top = p;
		s->count++;
		return OK;
	} 
}

出栈

//类似链表删除操作 
Status popLStack(LinkStack *s,ElemType *datas){
    if(isEmptyLStack(s)){
    	return ERROR;
	 } else {
	    LinkStackPtr p =  s->top;  //将栈顶节点赋给p 
		*datas = p->data;
		s->top = p->next;       //指针下移 
		free(p);               
		s->count--;
		return OK;
	}
}

清空链栈

Status clearLStack(LinkStack *s){
     ElemType *a = (ElemType *)malloc(sizeof(ElemType)); //设置一个值存储每次清空的值 
     if(a == NULL){
     	return ERROR;
	 }
	 while(!isEmptyLStack(s)){   //每次先判断是否为空栈再操作 
		popLStack(s,a);          //每次出栈一个直至空栈
	}        
	 s->count = 0;
	 return OK;
}

销毁链栈

Status destoryLStack(LinkStack *s){  
    if(isEmptyLStack(s)){
        free(s);
        t = 0;
        return OK;
    }
   	clearLStack(s);    //先清空栈再释放空间 
   	free(s);
   	t = 0;
   	return OK;
}

遍历链栈

void printLStack(LinkStack *s) {
    LinkStackPtr p = s->top;       //将栈顶节点赋给p 
	printf("-------该栈为:\n");
	while(p != NULL){
		printf("%d->",p->data);
		p = p->next;                 //指针下移 
	}
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值