顺序栈与两栈共享空间-C语言实现
栈是一种只能允许在栈顶插入数据与删除数据的数据结构,其实这就是一种特殊的线性表,特殊在 只能在表尾进行增减元素,上代码
#include <stdio.h> #define MAXSIZE 20 //栈空间大小
typedef int SElemType; //元素类型
typedef int Status; //返回值类型
#define OK 1 //操作成功
#define ERROR 0 //操作失败 typedef struct //顺序栈的数据结构
{
SElemType date[MAXSIZE]; //栈元素数据
int top; //栈顶指针
}SeqStack; //栈名 /*入栈操作*/
Status Push(SeqStack *S, SElemType e)
{
if(S->top == MAXSIZE-) //判断栈是否已满
return ERROR;
S->date[++S->top] = e; //栈顶指针加1,栈顶元素等于e
return OK;
} /*出栈操作*/
Status Pop(SeqStack *S, SElemType *e)
{
if(S->top == -) //判断栈是否为空
return ERROR;
*e = S->date[S->top--]; //将栈顶元素赋值与e,并将栈顶指针减1
return OK;
} void main()
{
SeqStack S; //创建栈S
S.top = -; //栈顶指针为-1,栈为空
int e; //入栈与出栈的元素 while(true)
{
printf("请选择对顺序栈的操作:\n");
printf("1.入栈\n");
printf("2.出栈\n");
printf("3.退出\n");
int a;
scanf("%d", &a);
switch(a)
{
case :
printf("请输入入栈的元素:");
scanf("%d", &e);
if(Push(&S, e))
printf("入栈成功\n");
else
printf("入栈失败\n");
break;
case :
if(Pop(&S, &e))
printf("出栈的元素为:%d\n",e);
else
printf("栈空\n");
break;
case :
return;
default:
printf("选择错误\n");
break;
}
}
}
顺序栈中有一类比较特殊的栈,就是两个数据类型一样的栈可以共享同一个数组空间,从而可以节约内存空间。
#include<stdio.h>
#define MAXSIZE 100 //栈空间大小
typedef int ElemType; //元素类型
typedef int Status; //返回值类型
#define OK 1 //操作成功
#define ERROR 0 //操作失败 typedef struct //共享栈结构体
{
ElemType date[MAXSIZE]; //栈元素
int top1; //栈1栈顶指针
int top2; //栈2栈顶指针
}SeqDoubleStack; //栈名 /*双向栈的入栈操作*/
Status Push(SeqDoubleStack *S, int flag, ElemType e)
{
if(S->top1 + == S->top2) //判断栈是否已满
return ERROR;
if(flag == ) //若flag等于1,则对栈1操作
S->date[++S->top1] = e; //将栈1指针加1,并赋值为e
if(flag == ) //若为2,对栈2操作
S->date[--S->top2] = e; //将栈2指针减1,并赋值为e
return OK;
} /*双向栈的出栈操作*/
Status Pop(SeqDoubleStack *S, int flag, ElemType *e)
{
if(flag == && S->top1 != -) //若flag为1且栈1栈顶不是-1
{
*e = S->date[S->top1--]; //将栈顶元素赋值给e,并将栈顶减1
return OK;
}
if(flag == && S->top2 != MAXSIZE) //若flag为2且栈2栈顶不是MAXSIZE
{
*e = S->date[S->top2++]; //将栈顶元素赋值给e,并将栈顶加1
return OK;
}
return ERROR;
} void main()
{
SeqDoubleStack S; //创建栈S
S.top1 = -; //栈顶1指针为-1,栈为空
S.top2 = MAXSIZE; //栈顶2指针为MAXSIZE,栈为空
int e; //入栈与出栈的元素 while(true)
{
printf("请选择对顺序栈的操作:\n");
printf("1.栈1入栈\n");
printf("2.栈2入栈\n");
printf("3.栈1出栈\n");
printf("4.栈2出栈\n");
printf("5.退出\n");
int a;
scanf("%d", &a);
switch(a)
{
case :
printf("请输入入栈1的元素:");
scanf("%d", &e);
if(Push(&S, , e))
printf("入栈成功\n");
else
printf("入栈失败\n");
break;
case :
printf("请输入入栈2的元素:");
scanf("%d", &e);
if(Push(&S, , e))
printf("入栈成功\n");
else
printf("入栈失败\n");
break;
case :
if(Pop(&S, , &e))
printf("出栈的元素为:%d\n",e);
else
printf("栈空\n");
break;
case :
if(Pop(&S, , &e))
printf("出栈的元素为:%d\n",e);
else
printf("栈空\n");
break;
case :
return;
default:
printf("选择错误\n");
break;
}
}
}
使用这种结构时,大多是这两个栈的空间需求有相反关系,使得在一个栈的元素个数增多时,另一个栈的元素个数会相对减少,比如股票的买卖可以使用这种结构,因为你买入的时候,就一定是有人卖出了;你挣钱的时候,就一定是有人赔钱了。如果这两个栈没有什么关系,那么对于内存的节省是不明显的,因为随时都有溢出的可能,那这就没有什么意义了。
顺序栈与两栈共享空间-C语言实现的更多相关文章
- 02两栈共享空间_DoubleStack--(栈与队列)
#include "stdio.h" #include "stdlib.h" #include "io.h" #include " ...
- C语言实现两栈空间共享
一个同学让我改一段两栈共享的C语言代码,实现进栈.出栈.输出栈里元素的功能. 代码如下: #include <stdio.h> #include <stdlib.h> #def ...
- HDU 1022 Train Problem I[给出两个长n的串,入栈和出栈顺序,判断入栈顺序是否可以匹配出栈顺序]
Train Problem I 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 As the new term comes, the Ignatius Train Sta ...
- C++模板实现动态顺序表(更深层次的深浅拷贝)与基于顺序表的简单栈的实现
前面介绍的模板有关知识大部分都是用顺序表来举例的,现在我们就专门用模板来实现顺序表,其中的很多操作都和之前没有多大区别,只是有几个比较重要的知识点需要做专门的详解. #pragma once #inc ...
- Linux网络栈下两层实现
http://www.cnblogs.com/zmkeil/archive/2013/04/18/3029339.html 1.1简介 VLAN是网络栈的一个附加功能,且位于下两层.首先来学习Linu ...
- N个数依次入栈,出栈顺序有多少种
题目:N个数依次入栈,出栈顺序有多少种? 首先介绍一下卡特兰数:卡特兰数前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 2 ...
- C++栈学习——顺序栈和链栈的差别
C++中栈有顺序栈和链栈之分.在顺序栈中,定义了栈的栈底指针(存储空间首地址base).栈顶指针top以及顺序存储空间的大小stacksize(个人感觉这个数据成员是能够不用定义的) //顺序栈数据结 ...
- n个元素的入栈顺序有多少种出栈顺序?
问题:w1.w2.w3.w4.w5,5个元素将会按顺序入栈,求出栈顺序有多少种情况. 先写一下结论方便记忆: 1个元素:1种 2个元素:2种 3个元素:5种 4个元素:14种 5个元素:42种 简单的 ...
- N个数依次入栈,出栈顺序有多少种?
对于每一个数来说,必须进栈一次.出栈一次.我们把进栈设为状态‘1’,出栈设为状态‘0’.n个数的所有状态对应n个1和n个0组成的2n位二进制数.由于等待入栈的操作数按照1‥n的顺序排列.入栈的操作数b ...
随机推荐
- RocketMQ实战:生产环境中,autoCreateTopicEnable为什么不能设置为true
1.现象 很多网友会问,为什么明明集群中有多台Broker服务器,autoCreateTopicEnable设置为true,表示开启Topic自动创建,但新创建的Topic的路由信息只包含在其中一台B ...
- 零基础小白入门IT开发指南
先自我介绍以下,本人是一枚刚毕业不到两年的某一线城市的程序员,本科阶段专业是计算机科学与技术.从大四开始出去实习到现在的编码经验也有快2年半了,两年半的时间包括实习在内任职过有4家公司,包括一家互联网 ...
- 「Usaco2008 Jan」人工湖O(∩_∩)O 纯属的模拟+栈
题目描述 夏日那让人喘不过气的酷热将奶牛们的烦躁情绪推到了最高点.最终,约翰决定建一个人工湖供奶牛消暑之用. 为了使湖看起来更加真实,约翰决定将湖的横截面建成N(1≤N≤105)个连续的平台高低错落的 ...
- 模块参数,系统调用,字符设备编程重要数据结构,设备号的申请与注册,关于cdev的API
1.模块参数 应用编程: int main(int argc, char *argv[]) { } ./a.out xxx yyy zzz ...
- 分享一份关于Hadoop2.2.0集群环境搭建文档
目录 一,准备环境 三,克隆VM 四,搭建集群 五,Hadoop启动与测试 六,安装过程中遇到的问题及其解决方案 一,准备环境 PC基本配置如下: 处理器:Intel(R) Core(TM) i5-3 ...
- PHP RSA签名(公钥、私钥)
签名算法: Setp.1 确定待签名参数 在请求参数列表中,除去sign参数外,其他需要使用到的参数皆是要签名的参数. 在通知返回参数列表中,除去sign参数外,凡是通知返回回来的 ...
- VS 使用 :新建项目
1.文件位置不放C盘
- CentOS7下安装带用户认证的squid服务器(无防火墙)
1 安装squid服务: yum install squid 安装htpasswd : yum install httpd-tools 2 配置squid配置文件 #该定义需在 ...
- hdu 1263 水果 (嵌套 map)
水果Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submissio ...
- mongodb存储二进制数据
mongodb 3.x存储二进制数据并不是以base64的方式,虽然在mongo客户端的查询结果以base64方式显示,请放心使用.下面来分析存储文件的存储内容.base64编码数据会增长1/3成为顾 ...