栈(C语言)

顺序存储结构

#define MAXSIZE 50 //定义栈中元素的最大个数 
typedef int ElemType; //ElemType的类型根据实际情况而定,这里假定为int 
typedef struct{
 ElemType data[MAXSIZE];
 int top; //用于栈顶指针
}SqStack;

(1)初始化

void InitStack(SqStack &S){
 S.top = -1; //初始化栈顶指针
}

(2)判栈空

bool StackEmpty(SqStack S){
  if(S.top == -1){
    return true; //栈空
  }
  else{
    return false; //不空
  }
}

(3)进栈

/*插入元素e为新的栈顶元素*/
Status Push(SqStack& S, ElemType e){
    //满栈
    if(S.top == MAXSIZE-1){
        return ERROR;
    }
    S.top++;   //栈顶指针增加一
    S.data[S.top] = e;    //将新插入元素赋值给栈顶空间
    return OK;
}

(4)出栈

Status pop(Stack &S, int& e) {
    if (S.top == -1) {
        return ERROR
    }
    e = S.data[S.top--];
}

(5)读取栈顶元素

/*读栈顶元素*/
Elem GetTop(SqStack. S){
	if (S.top == -1) {
		return ERROR;
	}
	int e =S.data[S.top];
	return e;
}

链式存储结构

/*栈的链式存储结构*/
/*构造节点*/
typedef struct StackNode{
    ElemType data;
    struct StackNode *next;
}StackNode, *LinkStackPrt;
/*构造链栈*/
typedef struct LinkStack{
    LinkStackPrt top;
    int count;
}LinkStack;

(1)进栈

/*插入元素e为新的栈顶元素*/
Status Push(LinkStack *S, ElemType e){
    LinkStackPrt p = (LinkStackPrt)malloc(sizeof(StackNode));
    p->data = e;
    p->next = S->top;    //把当前的栈顶元素赋值给新节点的直接后继
    S->top = p; //将新的结点S赋值给栈顶指针
    S->count++;
    return OK;
}

(2)出栈

/*若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR*/
Status Pop(LinkStack *S, ElemType *e){
    LinkStackPtr p;
    if(StackEmpty(*S)){
        return ERROR;
    }
    *e = S->top->data;
    p = S->top; //将栈顶结点赋值给p
    S->top = S->top->next;  //使得栈顶指针下移一位,指向后一结点
    free(p);    //释放结点p
    S->count--;
    return OK;
}

双堆栈结构

typedef struct SNode{
	ElementType *Data;
	int Top1;//堆栈1的栈顶指针 
	int Top2;//堆栈2的栈顶指针 
	int MaxSize;//堆栈最大容量 
}SNode*,PTSNode;

(1)初始化

PTSNode Create(int MaxSize){
	PTSNode S=(PTSNode)malloc(sizeof(struct SNode));
	S->Data=(ElementType*)malloc(MaxSize*sizeof(ElementType));
	S->Top1=-1;
	S->Top2=MaxSize;
	return S;
}

ps:top指针为两个栈的栈顶指针,将一个数组分为两个部分

(2)入栈

bool push(PTSNode S,ElementType X,int Tag){
	//Tag为区分两个栈的序号
	if(S->Top2-S->Top1==1){
		printf("堆栈满\n");
		return false;
	} 
	else{
		if(Tag==1){
			S->Data[++(S->Top1)]=X;
		}
		else{
			S->Data[--(S->Top2)]=X;
		}
		return true;
	}
}

(3)出栈

ElementType pop(PTSNode S,int Tag){
	if(Tag==1){
		if(S->Top1==-1){
			printf("堆栈1空\n");
			return ERROR;
		}
		else{
			return S->Data[(S->Top1)--];
		}
	}
	else{
		if(S->Top2==S->MaxSize){
			printf("堆栈2空\n");
			return ERROR;
		}
		else{
			return S->Data[(S->Top2)++];
		}
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值