数据结构(C语言版) 栈和队列 算法设计Demo1

Posted Aiden (winner)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构(C语言版) 栈和队列 算法设计Demo1相关的知识,希望对你有一定的参考价值。

将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端。当第0号栈的栈顶指针top[0]等于-1时该栈为空,当第1号栈的栈顶指针top[1]等于m时该栈为空。两个栈均从两端向中间增长。试编写双栈初始化,判断栈空、栈满、进栈和出栈等算法的函数。
双栈数据结构的定义如下:

Typedef struct
	int top[2],bot[2];		//栈顶和栈底指针
	SElemType *V;			//栈数组
	int m;					//栈最大可容纳元素个数
DblStack

[题目分析]

两栈共享向量空间,将两栈栈底设在向量两端,初始时,左栈顶指针为-1,右栈顶为m。两栈顶指针相邻时为栈满。两栈顶相向、迎面增长,栈顶指针指向栈顶元素。

[算法描述]

//(1) 栈初始化
int Init()
	S.top[0]=-1;
	S.top[1]=m;
	return 1; //初始化成功

//(2) 入栈操作:
int push(stk S ,int i,int x)
//i为栈号,i=0表示左栈,i=1为右栈,x是入栈元素。入栈成功返回1,失败返回0
	if(i<0||i>1)
		cout<<“栈号输入不对”<<endl;exit(0);
	
	if(S.top[1]-S.top[0]==1)
		cout<<“栈已满”<<endl;return(0);
	
	switch(i)
		case 0: S.V[++S.top[0]]=x; return(1); break;
		case 1: S.V[--S.top[1]]=x; return(1);

//push
//(3) 退栈操作
ElemType pop(stk S,int i)
//退栈。i代表栈号,i=0时为左栈,i=1时为右栈。退栈成功时返回退栈元素
//否则返回-1
	if(i<0 || i>1)
		cout<<“栈号输入错误”<<endl;exit(0);
	
switch(i)
	case 0: if(S.top[0]==-1)
		cout<<“栈空”<<endl;return-1);
	else return(S.V[S.top[0]--]);
	case 1: if(S.top[1]==m  
		cout<<“栈空”<<endl; return(-1);
	
	else return(S.V[S.top[1]++]);
	//switch      
//算法结束
//(4) 判断栈空
int Empty()
	return (S.top[0]==-1 && S.top[1]==m);

[算法讨论]

请注意算法中两栈入栈和退栈时的栈顶指针的计算。左栈是通常意义下的栈,而右栈入栈操作时,其栈顶指针左移(减1),退栈时,栈顶指针右移(加1)。

以上是关于数据结构(C语言版) 栈和队列 算法设计Demo1的主要内容,如果未能解决你的问题,请参考以下文章

数据结构(C语言版) 栈和队列 算法设计Demo14

数据结构(C语言版) 栈和队列 算法设计Demo9

数据结构(C语言版) 栈和队列 算法设计Demo8

数据结构(C语言版) 栈和队列 算法设计Demo13

数据结构(C语言版) 栈和队列 算法设计Demo10

数据结构(C语言版) 栈和队列 算法设计Demo12