数据结构---栈和队列之共享栈(C语言)

原创 2018年04月17日 15:42:11

相比于普通的顺序栈,共享栈主要是为了提高内存的利用率减少溢出的可能性而设计的。
当两个栈共享一片连续的内存空间时,应将两栈的栈底分别设在这片内存空间的两端,这样,当两个栈的栈顶在栈空间的某一位置相遇,才产生上溢。

解释:两个栈共享一片连续的内存空间,可知两个栈都是顺序栈(顺序栈占用连续的存储空间),为顺序栈分配好的连续空间大小在栈的操作过程中不变,并且这个连续的存储空间有恒定不变的两端。可知,这两个栈的栈底分别位于存储空间的两端,确定了栈底,则两栈栈顶必在存储空间内,显然当两个栈顶相遇时,存储空间被用尽,产生上溢。

示意图如下(某个博客找到的,觉得非常形象)

 第一个栈从数组头开始存储,第二个栈从数组尾开始,两个栈向中间拓展。
----------------------------------------------------------------------------------------------------------------------------------
完整代码如下:
#include <stdio.h>
#include <stdlib.h>
#define maxSize 100

typedef struct
{
	int data[maxSize];
	int top1;
	int top2;
}Stack;

Stack s;
/**************初始化栈*****************/
int initStack()
{
	s.top1 = -1;
	s.top2 = maxSize;   //这里就能看出,这个栈是个共享栈,是由2个栈组合而成,两个指针在两头
}


/***************进栈****************/
int push()
{
	int flag1; //指示是第一个栈还是第二个栈
	if (s.top1 + 1 == s.top2)   //如果两个头指针碰到一起了,栈就满了
		printf("栈满!");
	printf("按1从top1存入,按2从top2存入。按回车键停止存入!\n");
	scanf_s("%d", &flag1);
	
	switch (flag1)
	{
	     case 1:
		  printf("请输入栈1的数据:");
		  while (1)
		  {
			s.top1++;
			scanf_s("%d", &s.data[s.top1]);
			//printf("%d ", s.data[s.top1]);
			char c1 = getchar();
			if (c1 == '\n')
				break;
		  }
		 case 2:
			printf("\n请输入栈2的数据:");
			while (1)
			{
				--s.top2;
				scanf_s("%d", &s.data[s.top2]);
				//printf("%d ", s.data[s.top2]);
				char c2 = getchar();
				if (c2 == '\n')
					break;
			}
			break;
		}
	
	return 1;
}

/********************出栈******************/
int pop()
{
	int flag2;  //指示是哪个栈
	if (s.top1 == -1 && s.top2 == maxSize)
		printf("\n栈内无数据,你出个什么栈---\n");
	printf("按1从top1出栈,按2从top2出栈。按回车键停止!\n");
	scanf_s("%d", &flag2);
	printf("\n");
	switch (flag2)
	{
		case 1:
			printf("栈1出栈数据顺序为:");
			while (s.top1 > -1)
			{
				printf("%d ", s.data[s.top1]);
				s.top1--;
			}
		case 2:
			printf("\n栈2出栈数据顺序为:");
			while (s.top2 < maxSize)
			{	
				printf("%d ", s.data[s.top2]);
				s.top2++;
			}
	}

}

void main()
{
	printf("这是一个共享栈!\n");
	initStack();
	push();
	pop();
	system("pause");
}

结果图如下:

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lu_LLLR/article/details/79972994

C语言 数据结构 栈和队列 顺序栈(栈的顺序存储结构)

//C语言--数据结构--栈和队列  顺序栈(栈的顺序存储结构) #include #include #include  #include #include #includ...
  • qq_34814092
  • qq_34814092
  • 2017-06-11 20:58:00
  • 374

栈和队列(C语言版)

栈和队列是在程序中最常被用到的数据结构,其重要性不言而喻。栈: 定义:限定仅在表尾进行插入和删除操作的线性表,因此表尾称之为栈顶,表头为栈底,重要特点是后进先出(LIFO)操作: InitStack...
  • wqc_CSDN
  • wqc_CSDN
  • 2016-02-18 00:21:35
  • 3720

数据结构C语言实现栈和队列的基本操作

  • 2010年12月12日 18:06
  • 1KB
  • 下载

数据结构(C语言版) 清华大学出版社 第三章栈和队列 例题答案

  • 2014年09月06日 20:08
  • 125KB
  • 下载

数据结构(C语言版)”栈与队列“章节迷宫求解问题的思路与实现

迷宫求解问题来源自”数据结构(C语言版)“一书第50页的例题。该例题要求在不使用递归(因为暂时还没讲到),只能通过使用诸如入栈出栈的方式获取一条可以走出迷宫的路径。     在看完文字提示后,我就没有...
  • u010676110
  • u010676110
  • 2015-05-11 18:51:12
  • 2489

[栈及队列的操作]数据结构实验报告C语言源码

  • 2015年07月05日 10:26
  • 53KB
  • 下载

数据结构之---C语言实现共享栈

数据结构之---C语言实现共享栈
  • u012965373
  • u012965373
  • 2015-06-05 11:28:39
  • 1259

栈和队列 C语言实现

本文包括栈的顺序链接存储操作和队的顺序链接存储操作,全部c语言实现,具体程序分析 1、栈的概念 2、栈的顺序存储 示意图: 下面通过一个实例展示栈的顺序存储结构的操作实现,其中包含了6种操作: #i...
  • u012561696
  • u012561696
  • 2013-11-28 13:09:04
  • 4512

用栈和队列实现的停车场管理系统

停车场管理 问题描述:停车场是一个能放 n 辆车的狭长通道,只有一个大门,汽车按到达 的先后次序停放。若车场满了,车要停在门外的便道上等候,一旦有车走,则便 道上第一辆车进入。当停车场中的车离开...
  • baymin_dly
  • baymin_dly
  • 2017-08-05 14:18:33
  • 401

数据结构C语言实现系列[3]——关于栈的一些习题

#include stdio.h>#include stdlib.h>typedef int elemType;#include "LinkAccess.c"/* 对由fname所指字符串为文件名的程...
  • DL88250
  • DL88250
  • 2007-01-29 01:19:00
  • 2381
收藏助手
不良信息举报
您举报文章:数据结构---栈和队列之共享栈(C语言)
举报原因:
原因补充:

(最多只允许输入30个字)