顺序栈和链栈以及他们的应用
一、什么是栈
- 只允许在一端插入和删除的线性表
- 允许插入和删除的一端称为栈顶 (top),另一端称 为栈底(base)
- 特点:后进先出 (LIFO, Last In, First Out)
二、顺序栈
2.1 顺序栈的顺序存储表示
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
} SqStack;
2.2 顺序栈的初始化
Status InitStack (SqStack &S)
{// 构造一个空栈S
S.base=(SElemType*)malloc(STACK_INIT_SIZE*
sizeof(SElemType));
if (!S.base) exit (OVERFLOW); //存储分配失败
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
2.3 返回顺序栈顶元素
Status GetTop (SqStack S, SElemType &e) {
// 若栈不空, 用e返回栈顶元素,并返回 //OK; 否则返回ERROR
if (S.top = = S.base) return ERROR;
e = *(S.top-1);
return OK;
}//GetTop
2.4 压栈
Status Push (SqStack &S, SElemType e) {
if (S.top - S.base >= S.stacksize) {//栈满,追加存储空间
S.base = (SElemType *) realloc ( S.base,
(S.stacksize + STACKINCREMENT) *
sizeof (SElemType));
if (!S.base) exit (OVERFLOW); //存储分配失败
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
return OK;
}
2.5 出栈
Status Pop (SqStack &S, SElemType &e) {
// 若栈不空,则删除S的栈顶元素,
// 用e返回其值,并返回OK;
// 否则返回ERROR
if (S.top = = S.base) return ERROR;
e = *--S.top;
return OK;
}
三、链栈
typedef struct LinkNode
{ SElemType data;
struct LinkNode *link;
}LinkNode, *LinkStack;
四、栈的应用
4.1 数制转换
算法基于原理: N = (N div d)×d + N mod d
例如:(1348)10 = (2504)8 ,其运算过程如下:
void conversion () {
InitStack(S);
scanf ("%d",&N);
while (N) {
Push(S, N % 8);
N = N/8;
}
while (!StackEmpty(S)) {
Pop(S,e);
printf ( "%d", e );
}
} // conversion
4.2 括号匹配的检验
假设在表达式中
([]())或[([ ][ ])]
等为正确的格式,
[( ])或([( ))或 (()])
均为不正确的格式。
算法思想:
- 凡出现左括弧,则进栈;
- 凡出现右括弧,首先检查栈是否空?
- 若栈空,则表明该“右括弧”多余,
- 否则和栈顶元素比较,
- 若相匹配,则“左括弧出栈” ,
- 否则表明不匹配。
- 表达式检验结束时,
- 若栈空,则表明表达式中匹配正确,
- 否则表明“左括弧”有余。
public boolean isValid(String s) {
Stack stack = new Stack();
char string[] = s.toCharArray();
int index = 0;//指向栈判断到哪一位了
if(string.length==0)
return true;
while(index<string.length)
{
if(string[index]==' ')
{
index++;
continue;
}
char ithis = string[index];
if(string[index]=='('||string[index]=='['||string[index]=='{')
stack.push(string[index]);
else
{
if(stack.empty()==true)
{
return false;
}
char temp = (char)stack.pop();
if(string[index]==')'&&temp!='(' ||string[index]==']'&&temp!='[' ||string[index]=='}'&&temp!='{')
{
return false;
}
}
index++;
}
if(stack.empty()==true)
return true;
else
return false;
}