对于栈的部分总结。
概念
栈是一种操作受限的线性表。其主要特点是后进先出,即LIFO。只允许在线性表的一端进行插入删除。该端被称为栈顶,相对应的另一端被称作栈底。栈是线性表,即是一种逻辑结构,通常可分为顺序存储的顺序栈和链式存储的链栈。
顺序栈
使用一整块连续的空间用于存储栈中元素。此时需指明栈顶位置。
#define Maxsize 50
typedef struct Stack{
ElemType data[Maxsize];
int top;
}Stack;
部分基本操作
初始化 InitStack(S);
入栈 push(S,q);
出栈 pop(S,q);
判断是否为空 StackEmpty(S); //空则返回true
取栈顶元素(未出栈) GetTop(S,q);
链栈
可理解为不带头结点的单链表,每次入栈相当于使用头插法插入结点,出栈相当于删去首结点。
typedef struct Stack{
ElemType data;
struct Stack *next;
}Stack;
栈的应用
括号匹配
函数调用
表达式求值
括号匹配
#define Maxsize 1000
bool BracketsCheck(char data[],int n){
char Stack[Maxsize];
int top=-1;
for(int i=0;i<n;i++){
switch(data[i]){
case '[':
Stack[++top]=data[i];
break;
case '(':
Stack[++top]=data[i];
break;
case ‘{’:
Stack[++top]=data[i];
break;
case ')':
if(Stack[--top]!='(')
return false;
case ']':
if(Stack[--top]!='[')
return false;
case '}':
if(Stack[--top]!='{')
return false;
}
}
if(top!=-1)
return false;
return true;
}
表达式求值
中缀表达式:A+B*(C-D)-E/F
后缀表达式:ABCD-*+EF/-
思路:遇数字则输出,遇运算符时,若优先级>栈顶运算符则入栈;否则输出。
ABCD
+(-)
出栈,则有ABCD-
+-,出栈
ABCD-+EF
-/
ABCD-+EF/-
函数调用
如递归函数改写为非递归函数。
实现递归函数fn(x)=2xfn-1(x)+2(n-1)fn-2(x)
f0(X)=1,f1(x)=2x;
思路:从n=2开始逐个计算
double f(double x,int n){
double fv1=2*x,fv2=1;
double answer=0;
int i=2;
while(i<=n){
answer=2*x*fv1+2*(i-1)*fv2;
fv1=answer;
fv2=fv1;
}
return answer;
}
递归函数转换为非递归函数通常需要栈的帮助,但并不是绝对。