栈是一种只能允许在栈顶插入数据与删除数据的数据结构,其实这就是一种特殊的线性表,特殊在 只能在表尾进行增减元素,上代码

#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语言实现的更多相关文章

  1. 02两栈共享空间_DoubleStack--(栈与队列)

    #include "stdio.h" #include "stdlib.h" #include "io.h" #include " ...

  2. C语言实现两栈空间共享

    一个同学让我改一段两栈共享的C语言代码,实现进栈.出栈.输出栈里元素的功能. 代码如下: #include <stdio.h> #include <stdlib.h> #def ...

  3. HDU 1022 Train Problem I[给出两个长n的串,入栈和出栈顺序,判断入栈顺序是否可以匹配出栈顺序]

    Train Problem I 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 As the new term comes, the Ignatius Train Sta ...

  4. C++模板实现动态顺序表(更深层次的深浅拷贝)与基于顺序表的简单栈的实现

    前面介绍的模板有关知识大部分都是用顺序表来举例的,现在我们就专门用模板来实现顺序表,其中的很多操作都和之前没有多大区别,只是有几个比较重要的知识点需要做专门的详解. #pragma once #inc ...

  5. Linux网络栈下两层实现

    http://www.cnblogs.com/zmkeil/archive/2013/04/18/3029339.html 1.1简介 VLAN是网络栈的一个附加功能,且位于下两层.首先来学习Linu ...

  6. N个数依次入栈,出栈顺序有多少种

    题目:N个数依次入栈,出栈顺序有多少种? 首先介绍一下卡特兰数:卡特兰数前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 2 ...

  7. C++栈学习——顺序栈和链栈的差别

    C++中栈有顺序栈和链栈之分.在顺序栈中,定义了栈的栈底指针(存储空间首地址base).栈顶指针top以及顺序存储空间的大小stacksize(个人感觉这个数据成员是能够不用定义的) //顺序栈数据结 ...

  8. n个元素的入栈顺序有多少种出栈顺序?

    问题:w1.w2.w3.w4.w5,5个元素将会按顺序入栈,求出栈顺序有多少种情况. 先写一下结论方便记忆: 1个元素:1种 2个元素:2种 3个元素:5种 4个元素:14种 5个元素:42种 简单的 ...

  9. N个数依次入栈,出栈顺序有多少种?

    对于每一个数来说,必须进栈一次.出栈一次.我们把进栈设为状态‘1’,出栈设为状态‘0’.n个数的所有状态对应n个1和n个0组成的2n位二进制数.由于等待入栈的操作数按照1‥n的顺序排列.入栈的操作数b ...

随机推荐

  1. MongoDB的基础命令

    MongoDB的介绍 MongoDB: 是一个基于bson(二进制json)的NoSQL数据库 MongoDB的三要素: 数据库: 类似于MYSQL的数据库 集合: 类似于MYSQL的表 文档: 类似 ...

  2. 爬虫之selenium爬取斗鱼主播图片

    这是我GitHub上简单的selenium介绍与简单使用:https://github.com/bwyt/spider/tree/master/selenium%E5%9F%BA%E7%A1%80 & ...

  3. [考试反思]0828NOIP模拟测试32:沉底

    ,,190,180,170,170... 倒数第6,75. 啊...再这么下去要失去理想了... 开学翘课停课以来的第一场考试,就考成这鬼模样. 本来还可以凭借那几次高分苟在公共卷总分的第2,这一场直 ...

  4. NOIP模拟 14

    垃圾成绩,一点都不稳定. 如果把数组开小的分得到的话..总分还挺不错.. 那又能怪谁,都快NOIP了还犯这种傻逼错误 nc哥是要阿卡的节奏..真是太强了 某kyh也不知道偷了谁的rp,分高的一批 wd ...

  5. day1-python初识以及变量

    一.变量:将输入的内容赋值给变量,即变量=输入的内容 n1=input('请输入用户名:') 二. 变量名可以是 -英文. -数字.数字不能开头 -下划线,但是不可以下划线开头 不能是关键字 'and ...

  6. 012.Kubernetes二进制部署worker节点Flannel

    一 部署flannel 1.1 安装flannel kubernetes 要求集群内各节点(包括 master 节点)能通过 Pod 网段互联互通.flannel 使用 vxlan 技术为各节点创建一 ...

  7. 【实战】如何通过html+css+mysql+php来快速的制作动态网页(以制作一个博客网站为列)

    一.开发环境的搭建 (1)apache+php+mysql环境搭建 因为要用apache来做服务器,mysql作为数据库来存储数据,php来写代码以此实现网页与数据库的交互数据,所以需要下载上述软件, ...

  8. 50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)

    目前计算机视觉(CV)与自然语言处理(NLP)及语音识别并列为人工智能三大热点方向,而计算机视觉中的对象检测(objectdetection)应用非常广泛,比如自动驾驶.视频监控.工业质检.医疗诊断等 ...

  9. pat 1100 Mars Numbers(20 分)

    1100 Mars Numbers(20 分) People on Mars count their numbers with base 13: Zero on Earth is called &qu ...

  10. nyoj 655-光棍的yy (python, 未A)

    655-光棍的yy 内存限制:64MB 时间限制:1000ms 特判: No 通过数:4 提交数:7 难度:2 题目描述: yy经常遇见一个奇怪的事情,每当他看时间的时候总会看见11:11,这个很纠结 ...