1、栈的顺序存储结构
- 结构定义
typedef int SElemType;
typedef struct
{
SElemType data[MAXSIZE];
int pop;
}SqStack;
- 进栈操作
Status Push(SqStack *S, SElemType e)
{
if(S->top == MAXSIZE - 1);
{
return ERROR;
}
S->top++;
S->data[s->top] = e;
return OK;
}
- 出栈操作
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;
int top2;
}SqDoubleStack;
- 进栈操作
Status Push(SqDoubleStack *S, SElemType e, int stackNumber)
{
if(S->top1 + 1 == S->top2);
{
return ERROR;
}
if(stackNumber == 1)
S->data[++S->top1] = e;
else if(stackNumber == 2)
S->data[--S->top2] = e;
return OK;
}
- 出栈操作
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;
- 进栈操作
Status Push(LinkStack *S, SElemType e)
{
LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode));
s->data = e;
s->next = S->top;
S->top = s;
S->count++;
return OK;
}
- 出栈操作
Status Pop(LinkStack *S, SElemType *e)
{
LinkStackPtr p;
if(StackEmpty(*S))
return ERROR;
*e = S->top->data;
p = S->top;
S->top = S->top->next;
free(p);
S->count--;
return OK;
}
4、中缀表达式转后缀表达式、后缀表达式的计算
- 转换规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于栈顶符号(乘除优先加减)则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。
- 计算规则:从左到右遍历表达式的每个数字个符号,遇到是数字就进栈,遇到是符号,就将栈顶两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果。