数据结构(栈)

定义

栈是限定仅在表尾进行插入和删除的线性表

队列是只允许在一端进行插入在另一端进行删除操作的线性表。

 

允许插入和删除的一端称为栈顶(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;
	}
} 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值