顺序栈,共享栈和结构体中“.”与“->”的区别

1.top指向栈顶元素,令S.top = -1。

(1)初始化

//初始化
void InitStack(SqStack *S)
{
	S->top = -1;
}

(2)判断栈是否为空

//判断栈是否为空
bool StackEmpty(SqStack *S)
{
	if(S->top == -1)
		return true;
	else
		return false;
}

(3)进栈

//进栈
bool Push(SqStack *S,int x)
{
	if(S->top == Maxsize-1)//栈满,报错
		return false;
	S->data[++S->top] = x;//指针先加1,再入栈
	return true;
}

(4)出栈

//出栈
bool Pop(SqStack *S,int &x)
{
	if(S->top == -1)//栈空,报错
		return false;
	x = S->data[S->top--];//先出栈,指针再减1
	return true;
}

(5)读栈顶元素

//读栈顶元素
int GetTop(SqStack *S,int &x)
{
	if(S->top == -1)
		return 0;
	else
		{
		  x = S->data[S->top];
	     return x;
	    }
}

(6)遍历输出

//遍历输出
bool Traverse(SqStack *S)
{
  int i = S->top;
  if(StackEmpty(S))
  {
    printf("栈为空!");
	return false;
  }
  else
  {
	  while(i != -1)
	  {
	  printf("%d\n",S->data[i--]);
	  
	  }
	  return true;
  }
}

运行结果

2.栈顶指针初始化为S.top=0,即top指向栈中下一个可以插入元素的位置

(1)初始化

//初始化
void InitStack(SqStack *S)
{
	S->top = 0;//初始化
}

 (2)判断栈是否为空

//判断栈是否为空
bool StackEmpty(SqStack *S)
{
	if(S->top == 0)//当为0时栈为空
		return true;
	else
		return false;
}

(3)进栈

//进栈
bool Push(SqStack *S,int x)
{
	if(S->top == Maxsize+1)//栈满,报错
		return false;
	S->data[S->top++] = x;//先入栈,指针再加1,所以压栈10个元素之后指针为11
	return true;
}

(4)出栈

//出栈
bool Pop(SqStack *S,int &x)
{
	if(S->top == 0)//栈空,报错
		return false;
	x = S->data[--S->top];//指针先减1,再出栈,所以当栈中元素全部出栈之后指针为0
	return true;
}

(5)读栈顶元素

//读栈顶元素
int GetTop(SqStack *S,int &x)
{
	if(S->top == 0)
		return 0;
	else
		{
		  x = S->data[S->top];
	     return x;
	    }
}

运行结果

前两个对比,++S->top表示的是先加1然后再运行S->data[] ;S->top++表示的是先运行S->data[]然后S->top再加1.

3.共享栈

利用栈底元素相对位置不变的特性,可以让顺序栈共享一个一维数组空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸。两个栈的栈顶指针都是指向栈顶元素,假设top0=-1时为top0那边栈为空,top1=maxsize为top1那边栈为空;仅当两个指针相邻(top1-top0=1)时,判断栈满。top0先加1再赋值,top1先减1再赋值;相当于top0指向小的那边,top1指向栈大的那边

(1)初始化

void InitStack(SqStack &S)
{
	S.top0 = -1;
	S.top1 = maxsize;
}

(2)判断栈是否为空

bool StackEmpty(SqStack &S)
{
	if(S.top0 == -1 || S.top1 == maxsize)
		return true;
	else
		return false;
}

(3)进栈

bool Push(SqStack &S, int x,int y)
{
	if(S.top1 - S.top0 == 1)
		return false;
	else
	{
		S.data[++S.top0] = x;
		S.data[--S.top1] = y;
	}
	return true;
}

(4)出栈

bool Pop(SqStack &S,int &x,int &y)
{
	if(S.top0 != -1 || S.top1 != maxsize )
		return false;
	else
	{
		x = S.data[S.top0--];
		y = S.data[++S.top1];
	}
	return true;
}

(5)读栈顶元素

因为C++里面不可以同时返回两个值,所以可以通过结构体来达成,并且不要弄成指针类型,例如val->a这样是无法输出出去,会出错
return_X_Y Get(SqStack &S,int &x,int &y)
{
	 struct return_X_Y val;
	if(S.top0 != -1)
		val.a = S.data[S.top0];
	if(S.top1 != maxsize)
		val.b= S.data[S.top1];
	return val;
}

(6)遍历输出

void traverse(SqStack &S)
{
  if(S.top0 == -1 || S.top1 == maxsize)
	 { 
		 printf("栈为空!\n");
		 return;
     }
  if(S.top0 == -1)
	  printf("top0那边为空\n");
  if(S.top1 == maxsize)
	  printf("top1那边为空\n");
  int i = S.top0;
  int j = S.top1;
  printf("top0那边元素为:\n");
  while(i != -1)
  {
	  printf("%d\n",S.data[i--]);
  }
  printf("top1那边元素为:\n");
  while(j != maxsize)
  {
	  printf("%d\n",S.data[j++]);
  }
  return;
}

运行结果

结构体中“.”与“->”的区别

1、A->a表示A是指向结构体的指针

2、A.a表示A是结构体

3、A->a等效于(*A).a

4、A.B则A为对象或者结构体

5、A->B则A为指针,->是成员提取,A->B是提取A中的成员B,A只能是指向类、结构、联合的指针;

可以通过顺序栈和共享栈进行比较“.”与“->”的用法

顺序栈中使用的是"->"如果将其换成”.“,然后将S前的”*“换成"&",然后将main函数中的&去掉也会运行成功,以此来体验结构体中”.“与”->“的差别

全部代码

顺序表

//本次代码数据域以整数型为主
#include<stdio.h>

#define Maxsize 10
typedef struct 
{
  int data[Maxsize];
  int top;
}SqStack;
//函数说明
void InitStack(SqStack *S);//初始化
bool StackEmpty(SqStack *S);//判断栈是否为空
bool Push(SqStack *S,int x);//进栈
bool Pop(SqStack *S,int &x);//出栈
int GetTop(SqStack *S,int &x);//读取栈顶元素
bool Traverse(SqStack *S);//遍历输出
int main(void)
{
  SqStack S;
  int x;
  InitStack(&S);
  Push(&S,1);
  Push(&S,2);
  Push(&S,3);
  Push(&S,4);
  Push(&S,5);
  Push(&S,6);
  Push(&S,7);
  Push(&S,8);
  Push(&S,9);
  Push(&S,10);
  Traverse(&S);
  int val = GetTop(&S,x);
  printf("栈顶元素为:%d\n",val);
  Pop(&S,x);
  printf("出栈之后栈中元素为:\n");
  Traverse(&S);

  return 0;

}

/*//top指的是栈顶元素
//初始化
void InitStack(SqStack *S)
{
	S->top = -1;
}

//判断栈是否为空
bool StackEmpty(SqStack *S)
{
	if(S->top == -1)
		return true;
	else
		return false;
}

//进栈
bool Push(SqStack *S,int x)
{
	if(S->top == Maxsize-1)//栈满,报错
		return false;
	S->data[++S->top] = x;//指针先加1,再入栈
	return true;
}

//出栈
bool Pop(SqStack *S,int &x)
{
	if(S->top == -1)//栈空,报错
		return false;
	x = S->data[S->top--];//先出栈,指针再减1
	return true;
}

//读栈顶元素
int GetTop(SqStack *S,int &x)
{
	if(S->top == -1)
		return 0;
	else
		{
		  x = S->data[S->top];
	     return x;
	    }
}

//遍历输出
bool Traverse(SqStack *S)
{
  int i = S->top;
  if(StackEmpty(S))
  {
    printf("栈为空!");
	return false;
  }
  else
  {
	  while(i != -1)
	  {
	  printf("%d\n",S->data[i--]);
	  
	  }
	  return true;
  }
}
*/

//top指向栈顶元素的下一个位置
//初始化
void InitStack(SqStack *S)
{
	S->top = 0;//初始化
}

//判断栈是否为空
bool StackEmpty(SqStack *S)
{
	if(S->top == 0)//当为0时栈为空
		return true;
	else
		return false;
}

//进栈
bool Push(SqStack *S,int x)
{
	if(S->top == Maxsize+1)//栈满,报错
		return false;
	S->data[S->top++] = x;//先入栈,指针再加1,所以压栈10个元素之后指针为11
	return true;
}

//出栈
bool Pop(SqStack *S,int &x)
{
	if(S->top == 0)//栈空,报错
		return false;
	x = S->data[--S->top];//指针先减1,再出栈,所以当栈中元素全部出栈之后指针为0
	return true;
}

//读栈顶元素
int GetTop(SqStack *S,int &x)
{
	if(S->top == 0)
		return 0;
	else
		{
		  x = S->data[S->top];
	     return x;
	    }
}

//遍历输出
bool Traverse(SqStack *S)
{
  int i = S->top;
  if(StackEmpty(S))
  {
    printf("栈为空!");
	return false;
  }
  else
  {
	  while(i != 0)
	  {
	  printf("%d\n",S->data[--i]);
	  
	  }
	  return true;
  }
}

共享栈

#include<stdio.h>
#define maxsize 15
typedef struct
{
  int data[maxsize];
  int top0;
  int top1;
}SqStack;

struct return_X_Y
{
  int a;
  int b;
};

//函数说明
void InitStack(SqStack &S);
bool StackEmpty(SqStack &S);
bool Push(SqStack &S, int x,int y);
bool Pop(SqStack &S,int &x,int &y);
return_X_Y Get(SqStack &S,int &x,int &y);
void traverse(SqStack &S);
int main(void)
{
  SqStack S;
  int x,y;
  
  InitStack(S);
  Push(S,1,-1);
  Push(S,2,-2);
  Push(S,3,-3);
  Push(S,4,-4);
  Push(S,5,-5);
  Push(S,6,-6);
  Push(S,7,-7);
  traverse(S);
   struct return_X_Y pVal = Get(S,x,y);
  printf("top0,top1两边栈顶元素分别为:%d,%d\n",pVal.a,pVal.b);
  Pop(S,x,y);
  printf("删除元素之后栈中元素为:\n");
  traverse(S);
  return 0;
}

void InitStack(SqStack &S)
{
	S.top0 = -1;
	S.top1 = maxsize;
}

bool StackEmpty(SqStack &S)
{
	if(S.top0 == -1 || S.top1 == maxsize)
		return true;
	else
		return false;
}

bool Push(SqStack &S, int x,int y)
{
	if(S.top1 - S.top0 == 1)
		return false;
	else
	{
		S.data[++S.top0] = x;
		S.data[--S.top1] = y;
	}
	return true;
}

bool Pop(SqStack &S,int &x,int &y)
{
	if(S.top0 != -1 || S.top1 != maxsize )
		return false;
	else
	{
		x = S.data[S.top0--];
		y = S.data[++S.top1];
	}
	return true;
}


return_X_Y Get(SqStack &S,int &x,int &y)
{
	 struct return_X_Y val;
	if(S.top0 != -1)
		val.a = S.data[S.top0];
	if(S.top1 != maxsize)
		val.b= S.data[S.top1];
	return val;
}


void traverse(SqStack &S)
{
  if(S.top0 == -1 || S.top1 == maxsize)
	 { 
		 printf("栈为空!\n");
		 return;
     }
  if(S.top0 == -1)
	  printf("top0那边为空\n");
  if(S.top1 == maxsize)
	  printf("top1那边为空\n");
  int i = S.top0;
  int j = S.top1;
  printf("top0那边元素为:\n");
  while(i != -1)
  {
	  printf("%d\n",S.data[i--]);
  }
  printf("top1那边元素为:\n");
  while(j != maxsize)
  {
	  printf("%d\n",S.data[j++]);
  }
  return;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值