大话数据结构---栈

1、栈的顺序存储结构

- 结构定义

typedef int SElemType;
typedef struct
{
	SElemType data[MAXSIZE];
	int pop;    /*用于栈顶指针*/
}SqStack;

- 进栈操作

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

- 出栈操作

/*若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR*/
Status Pop(SqStack *S, SElemType *e)
{
	if(S->top == -1)
	return ERROR;
	*e = S->data[S->top];
	S->top--;
	return OK;
}

2、两栈共享空间

- 结构定义

/*两栈共享空间结构*/
typedef struct
{
	SElemType data[MAXSIZE];
	int top1;    /*栈1栈顶指针*/
	int top2;    /*栈2栈顶指针*/
}SqDoubleStack;

- 进栈操作

/*插入元素e为新的栈顶元素*/
Status Push(SqDoubleStack *S, SElemType e, int stackNumber)
{
	if(S->top1 + 1 == S->top2);   /*栈满,不能再push新元素了*/
	{
		return ERROR;            
	}
	if(stackNumber == 1)           /*栈1有元素进栈*/
		S->data[++S->top1] = e;     /*若栈1,则先top1+1后给数组元素赋值*/
	else if(stackNumber == 2)       /*栈2有元素进栈*/
		S->data[--S->top2] = e;     /*若栈1,则先top2-1后给数组元素赋值*/
	return OK;
}

- 出栈操作

/*若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR*/
Status Pop(SqDoubleStack *S, SElemType *e, int stackNumber)
{
	if(stackNumber == 1)           
	{
		if(S->top1 == -1)
			return ERROR;
		*e = S->data[S->top1--];
	}
	else if(stackNumber == 2)
	{
		if(S->top2 == MAXSIZE)
			return ERROR;
		*e = S->data[S->top2++];
	}
	return OK;
}

3、栈的链式存储结构(链栈)

- 结构定义

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

typedef struct LinkStack
{
	LinkStackPtr top;
	int count;
}LinkStack;

- 进栈操作

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

- 出栈操作

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

4、中缀表达式转后缀表达式、后缀表达式的计算

  • 转换规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于栈顶符号(乘除优先加减)则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。
  • 计算规则:从左到右遍历表达式的每个数字个符号,遇到是数字就进栈,遇到是符号,就将栈顶两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值