栈和队列--栈

1、顺序栈

一组地址连续的存储单元加一个标识栈顶元素的指针。

#define MaxSize 50		//定义栈中最大元素个数
typedef struct{		
	ElemType data[MaxSize];//存放栈中的元素
	int Top;//栈顶指针
}SqStack;

栈空:s.top==-1
栈满:s.top==MaxSize-1
栈长:s.top+1

2、顺序栈的方法

(1)初始化InitStack

void InitStack(SqStack &S){
	S.top=-1;								//初始化栈顶指针
}

(2)栈判空StackEmpty

bool StackEmpty(SqStack &S){
	if(S.top==-1){
		return true;
	else 
		return false;
	}
}

(3)进栈Push 入栈判满,出栈判空

bool Push(SqStack &S,ElemType x){
	if(s.top==MaxSize-1)
		return false;
	S.top++;
	S.data[S.top]==x;
	return true;

}

(4)出栈Pop


bool Pop(SqStack &S,ElemType &x){
	if(s.top==-1)
		return false;
	x=s.data[s.top--];
	reurn true;

}

3、共享栈

两个顺序栈共享一个一维空间,将两个栈的栈底分别设置到两端

4、栈的链式存储结构

typedef struct LinkNode{
	ElemType data;
	struct  LinKNode *next;
}*LiStack

5、n个不同元素进栈,出栈元素不同排列 的个数为

在这里插入图片描述

6、判断出入栈的操作序列是否合法

思路:(1)入栈次数必须大于等于出栈次数

bool  isStandStack(char a[ ]){
			int i=0;
			int count_In=0,count_Out=0
			while(i<a.length&&count_In>=count_Out){
					if(a[i]='I')
							count_In++;		 
					else
							count_out++;
					i++;

			}
			if(count_in==count_out)
				return true;
			else
				return false;
			

}		

7、用栈的思想判断单链表元素 是否对称

思想:设置一个长度为单链表一半的数组作为栈,将每个元素存入,当再次遇到此元素时,弹出,最后如果数组为空,则说明对称。

bool dc(LinkList L,int n){
	int i=0;   
	char s[n/2];
	p=L->next;//p指向第一个结点
	while(i<n/2){
		s[i++]=p->data;
		p=p->next;
	}
	i--;
	if(n%2==1)								//如果是奇数,指针后移一个元素
		p=p->next;
	while(p!=null&&s[i]==p->data){		//如果下一个结点不为空且当前结点
			i--;
			p=p->next;
	}
	if(i=-1)
		return true;
	else
		return false;
}

8、 共享栈入栈出栈的操作算法
思想:共享栈相当于两个栈,需要区分是那个栈入栈;入栈判满。共享栈判满方式是top2-top11;
出栈判空,共享栈判空一是top1
-1,二是top2==maxSize;

#define maxSize 100;
#define element int
typedef struct{
	element stack[maxSize];
	int top1,top2;
}stk;
stk s;
(1)入栈
bool push(int i,element x){		//i是栈号
	if(!(i=1||i=2)){
		printf("栈号不匹配!");
		exit(0);
	}
	if(top2-top1==1){
		printf("栈满!\0");
		return 0;
	}
	switch(i){
		case 1:s.stack[++s.top1]=x;return 1;break;
		case 2:s.stack[--s.top2]=x;return 1;break;
	}
}
(2)出栈
bool pop(int i,element &x){
	if(!(i=1||i=2)){
		printf("栈号不匹配!");
		exit(0);
	}
	switch(i){
		case 1:
			if(s.top1==-1){
				printf("栈1空,无法出栈");
				return 0;
			}
			else{
				x=s.stack[s.top1--];
				return 1;
			}
			break;
		case 2:
			if(s.top1==maxSize){
				printf("栈2空,无法出栈");
				return 0;
			}
			else{
				x=s.stack[s.top2++];
				return 1;
			}
			break;	
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值