定义
栈是限定仅在表尾进行插入和删除的线性表
队列是只允许在一端进行插入在另一端进行删除操作的线性表。
栈
允许插入和删除的一端称为栈顶(top),另一端称为栈底(buttom),又称先进后出的线性表(Last In First Out)就像手枪的弹夹
源码(基于线性表)还有基于数组的那就比较简单,这里就不说了
#include"iostream"
#include"stdlib.h"
using namespace std;
typedef int SelemType;
typedef struct Zhan *Stack;
#define MAX 20
struct Zhan{
SelemType data[MAX];
int Top; // 栈顶指针
};
Stack Initialize(){ //初始化线性表
Stack L;
L = (Stack)malloc(sizeof(struct Zhan));
L->Top=-1;
cout<<"初始化成功"<<endl;
return L;
}
bool Push(Stack Z,int x){
if(Z->Top==MAX-1)
return false;
Z->Top++;
Z->data[Z->Top]=x;
return true;
}
bool Pop(Stack Z){
if(Z->Top==-1){
return false;
}
else{
cout<<Z->data[Z->Top]<<endl;
Z->Top--;
}
}
int main(){
Stack L = Initialize();
Push(L,10);
Push(L,20);
cout<<L->data[0]<<endl;
cout<<L->Top<<endl;
}
两栈共享空间
判满:当S->top1+1==S->top2时栈满 top1=max-1 || top2=0
push和pop 3个参数,最后一个为stacknumber意思时栈1或栈2入栈或出栈
栈的链式存储(链栈)
结构+初始化
typedef struct StackNode *Next;
typedef struct StackNode *Top;
struct StackNode{ //栈的内容和上以结点
int data;
Next next;
};
struct LinkStack{ //存储栈的栈顶指针
Top top;
int count;
};
stack Initialize(){ //初始化
stack s=(stack)malloc(sizeof(struct StackNode)); //申请内存
if(count) //判空
s->next=s->top;
cout<<"初始化成功"<<endl;
return L;
}
Push
bool Push(stack S,int x){
stack s=(stack)malloc(sizeof(struct StackNode));
s->data=x;
s->next = S->top;
S->top=s;
S->count++;
return true;
}
Pop
bool Pop(stack S){
if(count){
return false;
}
stack p;
p=S->top;
S->top=S->top->next;
free(p);
S->count++;
return true;
}
栈的应用------递归
把一个直接调用自己或者通过一系列的调用语句间接地调用自己的函数,称作递归函数。
每个递归定义必须至少有一个条件,满足时递归不再进行,即不再应用自身而是返回值退出。
斐波那契数列的递归实现
#include"iostream"
using namespace std;
int Fb(int i){
if(i<2){
return i==0? 0:1;
}
return Fb(i-1)+Fb(i-2);
}
int main(){
int i;
for(int i=0;i<40;i++){
cout<<Fb(i)<<" ";
return 0;
}
}