顺序栈与两栈共享空间-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 ...
随机推荐
- 学习笔记04IIS
IIS机制:1.能监听端口,获取socket的客户端对象2.获取请求报文,将请求报文变成对象.3.处理请求报文,通过HttpApplication.ProcessRequest方法来处理HttpCon ...
- Python文件处理:创建、打开、追加、读、写
在Python中,不需要导入外部库来读取和写入文件.Python为创建.写入和读取文件提供了内置的函数. 在本文中,我们将学习 如何创建文本文件 如何将数据附加到文件中 如何读取文件 如何逐行读取文件 ...
- Numpy 排序和使用索引
# 导包 import numpy as np 排序 .sort() x = np.arange(16) # array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...
- NOIP模拟 37
啊哈这次没什么智障低错丢rank什么的托词了STO 发现好像110我就拿满了.. 水平不行..只会简单题qaq T1 可以树上启发式合并水过(普通分治也行) T2 我连那么显然的 一劳永逸的容斥都没想 ...
- 来探讨一下最近面试问的ThreadLocal问题
中高级阶段开发者出去面试,应该躲不开ThreadLocal相关问题,本文就常见问题做出一些解答,欢迎留言探讨. ThreadLocal为java并发提供了一个新的思路, 它用来存储Thread的局部变 ...
- jmeter-手机号验证注册登录
1.测试计划->线程组 2.首先获取需要注册的手机号,获取手机号的方式如下 (1)使用配置元件导入需要注册的手机 ·右键线程组-->配置元件-->CSV数据文件设置,如图: (2)使 ...
- linux常用的命令解释
1.man命令的操作按键: 按键 用处 空格键 向下翻一页. [Page Down] 向下翻一页. [Page Up] 向上翻一页. [HOME] 直接前往首页. [END] 直接前往尾页. /关键词 ...
- MQ应用之解耦
简介 消息队列 MQ 既可为分布式应用系统提供异步解耦和削峰填谷的能力,同时也具备互联网应用所需的海量消息堆积.高吞吐.可靠重试等特性. 应用场景 削峰填谷:诸如秒杀.抢红包.企业开门红等大型活动时皆 ...
- C#winfrom将XML数据保存读取删除
//创建一个数据集,将其写入xml文件 string name = "1.xml"; System.Data.DataSet ds = new System.Data.DataSe ...
- Cef 因系统时间不正常,导致页面访问空白问题
当我们的系统时间不正常,比如设置一个日期-1999年9月9日,会引发证书问题. 系统时间不正常-IE有概率能访问 触发NavigateError事件,异常代码INET_E_INVALID_CERTIF ...