顺序栈和链栈以及他们的应用

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

一、什么是栈

  • 只允许在一端插入和删除的线性表
  • 允许插入和删除的一端称为栈顶 (top),另一端称 为栈底(base)
  • 特点:后进先出 (LIFO, Last In, First Out)

在这里插入图片描述

二、顺序栈

2.1 顺序栈的顺序存储表示

1
2
3
4
5
6
7
cpp复制代码#define  STACK_INIT_SIZE  100
#define STACKINCREMENT 10
typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
} SqStack;

2.2 顺序栈的初始化

1
2
3
4
5
6
7
8
9
cpp复制代码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 返回顺序栈顶元素

1
2
3
4
5
6
cpp复制代码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 压栈

1
2
3
4
5
6
7
8
9
10
11
12
cpp复制代码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 出栈

1
2
3
4
5
6
7
8
cpp复制代码Status Pop (SqStack &S, SElemType &e) {
// 若栈不空,则删除S的栈顶元素,
// 用e返回其值,并返回OK;
// 否则返回ERROR
if (S.top = = S.base) return ERROR;
e = *--S.top;
return OK;
}

三、链栈

1
2
3
4
cpp复制代码typedef   struct LinkNode 
{ SElemType data;
struct LinkNode *link;
}LinkNode, *LinkStack;

四、栈的应用

4.1 数制转换

1
ini复制代码算法基于原理:	  N = (N div d)×d + N mod d

例如:(1348)10 = (2504)8 ,其运算过程如下:

在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
11
12
cpp复制代码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 括号匹配的检验

1
2
3
4
5
复制代码假设在表达式中
([]())或[([ ][ ])]
等为正确的格式,
[( ])或([( ))或 (()])
均为不正确的格式。

算法思想:

  1. 凡出现左括弧,则进栈;
  2. 凡出现右括弧,首先检查栈是否空?
    • 若栈空,则表明该“右括弧”多余,
    • 否则和栈顶元素比较,
      • 若相匹配,则“左括弧出栈” ,
      • 否则表明不匹配。
  3. 表达式检验结束时,
    • 若栈空,则表明表达式中匹配正确,
    • 否则表明“左括弧”有余。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
cpp复制代码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;




}

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%