【数据结构栈的存储结构】

  • 栈的顺序存储结构
# define MAXSIZE <最大元素数>
typedef struct
{
	datatype elem[MAXSIZE];
	int top;
}SeqStack;

1.入栈

int Push_SeqStack(SeqStack *S,datatype x)  //插入数据元素x
{
	if(S->top==MAXSIZE-1)
	  printf("栈满不能入栈");
	  return 0;
	  else
	{
		  S->top++;//栈顶指针加一
		  S->elem[S->top]=x;//将插入的数据元素x赋给栈顶空间
		  return 1;
	}
}
  • 2.出栈
int Pop_SeqStack(SeqStack*S,datatype*x)
{
	if(S->top=-1)
	printf("栈空不能出栈");
	rreturn 0;
	else
	{
		*x=S->elem[S->top];//栈顶元素存入*下,返回
		S->top--;//栈顶指针减一
		return 1;
	}
}

//入栈先判栈满,条件为S->top==MAXSIZE-1,栈满是不能入栈,否则空间溢出,这就叫上溢;
//出栈和读栈顶先判栈空,为空时不能操作,否则产生错误,这就叫下溢。

  • 两个栈的共享空间

/*question 两个栈的共享空间
*@thought if两个栈共享一个一维数组stack[MAXSIZE],so 利用栈的“栈底位置不变,栈顶位置动态变化”的特点,两个栈底在两头也就是-1和MAXSIZE,栈顶往中间延伸。只要整个数组stack[MAXSIZE]未满,两个栈都不会上溢
*/

#define MAXSIZE <最大元素>
typedef struct 
{
	datatype stack [MAXSIZE];//data域
	int lefttop;//左栈栈顶位置指示器
	int righttop;//右栈栈顶位置指示器
}dupsqstack;
//左栈栈顶往右边移动加一,右栈栈顶往左移减去一
//为了识别左右栈,设标识记忆
   char status;
   status='L'//左栈
   status='R'//右栈
//栈满条件为S->lefttop-S->righttop=1
  • 1.初始化操作
int initDupStack(dupsqstack *S)
{
	if((S=(dupsqstack*)malloc(sizeof(dupsqstack)==NULL)//创建空间
		return 0;
		S->lefttop=-1;
		S->righttop=MAXSIZE;
		return 1;
	}
  • 2.入栈操作——先判断栈满
int pushDupStack(dupsqstack*S,char status,datatype x)
{
	if ((S->lefttop+1==S->righttop)
		piintf("栈满");
		return 0;
		if(status='L')
			S->stack[++S->lefttop]=x;//左栈进栈
		else 
			if(status='R')          
			S->stack[--S->righttop]=x; //右栈进栈 
		else
			return 0;//参数错误
		return 1;
		}
  • 3.出栈操作
datatype popDupStack(dupsqstack*S,char status)
{
	if(S->lefttop<0)
		printf("左栈为空");
	return NULL;
	else
		return (S->stack[S->lefttop--];//左栈出栈
}
else
	if(status=='R')
{
	if(S->righttop>MAXSIZE-1)
     retuen NULL;
	else
		return(S->stack[S->righttop++]);//右栈出栈
}
else
	return NULL;//参数错误
	}
链栈:链式存储结构实现的栈。
	typedef struct node
	{
		datatype data ;
		struct node *next;
	}StackNode ,*LinkStackptr;//ptr表示指针,LinkStackptr top为栈顶元素
	//用一个计数器记录链栈中元素的个数:int  count。将top、count放在一个结构体中
typedef struct linkStack//定义一个这样的结构体
	{
		LinkStackptr top;
		int count;
	}linkStack;

因为链栈区别于单链表,主要是栈的操作是在栈顶进行插入和删除,单链表中为了实现这个特意设了头节点,而显然将链表的头部作栈顶就行,不用单独设头节点
空栈,头指针为空,S->top=NULL

**入栈**
//假设x是要入栈的元素,首先建立一个结点p,将其数据域赋值给下,即p->data=x;将p的后继指针指向栈的S->top,即S->top=p->next,之后将S->top指针指向p,记得给栈中元素加一
int Push_LinkStack(LinkStack *S,datatype x)
{
	LinkStackptr p;
	if(((p=LinkStackptr)malloc (sizeof(StackNode)))==NULL)
	return 0;
	p->data=x;
	p->next=S->top;//将当前栈顶的指针元素赋给插入节点的后继
	S->top=p;
	S->count++;
	return 1;
}
//## 出栈,栈不空用一个指针p指向当前栈顶,栈顶指针下移一位,释放p,最后栈中元素减去一
LinkStack Pop_LinkStack(LinkStack*S,datatype*x)
{
	LinkStackptr p;
	if(S->top==NULL)
	return NULL;//栈空判断
	else
	{
		*x=(S->top)->data;
		p=S->top;//栈顶结点赋给p
		S->top=(S->top)->next;//栈顶指针下移一位
		free(p);
		S->count--;
		return(S->top);
	}
}

``

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值