顺序栈和双向顺序栈的操作
一、顺序栈
1.定义结构:
#include<stdio.h>
#include<stdlib.h> //malloc和realloc函数的库
#define maxsize 100 //宏不需要加';'
typedef struct {int data[maxsize];int top;
}myStack,*Stack;
顺序栈类似于顺序表,栈中的元素可以用一个一维数组来保存,同时也要有最大值;而且还要包括一个栈顶top指针,因为栈底指针可任意为一个端点,所以可省略。
2.判空栈:
//判空栈int Empty(Stack L){if(L->top==-1) return 1; //为空栈else return 0; //不为空栈}
判空栈需要注意的是:栈顶指针刚开始是为-1
栈满对于顺序栈来说就是等于maxsize,在此不多说。
3.计算栈的长度:
int length(myStack *s) //计算栈中元素的个数
{printf("\n此时栈的长度为%d\n",s->top+1);
}
顺序栈的长度=top指针+1的数。
4.取栈顶元素:
//取栈顶元素
int get(myStack *s){if(Empty(s)) printf("栈空!"); //栈空 else printf("栈顶元素为:%d\n",s->data[s->top]); //因为data存放在一维数组所以取的时候遵循数组的写法
}
5.初始化:
//初始化栈int Init(myStack *&s) {s=(myStack *)malloc(sizeof(myStack)); //定义空间结点s->top=-1; //栈空:top==-1return 1;}
6.入栈:
//入栈
int push(myStack *&s, int e) //元素e入栈
{if(s -> top == maxsize - 1)return 0;else{s -> top++; //栈顶指针加一 s -> data[s -> top] = e;//新插入的元素进栈 return 1;}
}
7.出栈:
//出栈void pop(Stack L){int i=0 ;if(Empty(L)) printf("栈空!"); //栈空while(i<=L->top){ //i<栈顶时,输出,栈顶-- printf("%d ",L->data[L->top]);L->data[L->top]=0; //将出栈的元素位置赋值0 L->top--;}}
这里根据自己思路写的,也能实现,将出栈的元素赋值为0,在遍历的时候以这个条件为基本在视觉效果较好的情况下遍历。
8.总体main函数:
int main(){myStack *s; //定义栈 if(Init(s)==1){ //初始化栈printf("初始化成功!\n"); }printf("-----进行1-5的入栈:\n");printf("入栈顺序为: ") ;for(int i=1;i<=5;i++){printf("%d ",i);push(s,i);}length(s); //求栈长 get(s); //取栈顶元素 printf("-----进行1-5的出栈:\n");printf("出栈顺序为: ");pop(s); //出栈 length(s); //求栈长 }
9.运行如图:
二、双向栈(左栈和右栈)共享一个空间
双向栈用于存储空间较大时,顺序栈无法满足,从而导致溢出或者空闲情况。
特性:栈底指针不变,栈顶指针动态变化;左右两个栈的最大空间均大于maxsize/2.
1.结构定义:
#include<stdio.h>
#include<stdlib.h>
#define maxsize 10 //宏不需要加';'
typedef struct {int data[maxsize];int left; //左栈top int right; //右栈top
}DoubleStack,*Double;
2.初始化:
左栈和右栈的起始地都是从有效空间后一位开始的,左栈从前往后是递增,右栈是从后往前是递增。
//初始化int Init(Double &L){L=(Double)malloc(sizeof(DoubleStack));if(L==NULL) return -1;L->left=-1; //左栈有效位后一位:-1 L->right=maxsize; //右栈有效位后一位:maxsize return 1; }
3.入栈:
入栈要存在一个status的判断,个人定义为1时是左栈,为2时是右栈。
//入栈
int push(Double &L,int status,int x){ //status=1代表左数,=2代表右树 if(L->left+1==L->right){printf("栈满!");return -1;} if(status==1){L->left++; //左指针往后L->data[L->left]=x; //赋值}else if(status==2){L->right--; //右指针往前L->data[L->right]=x; //赋值}
}
4.出栈:
出栈元素的值个人先将它输出在定义为0,在遍历时借用这个条件可以输出视觉感官较好的形式。
//出栈
int pop(Double &L,int status) {if(status==1){if(L->left<0) {printf("左栈为空!\n"); return -1;}else{printf("出%d ",L->data[L->left]); //输出要出栈的元素 L->data[L->left]=0; //将data[L->left]赋值0 L->left--;}}else if(status==2){if(L->right>maxsize-1){printf("右栈为空!\n"); return -1;}else{printf("出%d ",L->data[L->right]); //输出要出栈的元素L->data[L->right]=0; //将data[L->right]赋值0 L->right++;}}
}
5.遍历:
如果元素的值为0,则输出[]。
//遍历栈 void Print(Double &L) {int i,j;for(i=0;i<=maxsize-1;i++){ if(L->data[i]!=0){ //如果元素出栈则出栈函数赋值为0;输出[] printf("%d ",L->data[i]);}else{printf("[]");} }}
6.main函数:
int main(){DoubleStack *s;char L,R;if(Init(s)==1){printf("初始化成功!\n");}printf("进行1-5的入栈(左右同时):\n");for(int i=1;i<=5;i++){ //for循环来输入栈 push(s,1,i); //1代表左栈 push(s,2,i); //2代表右栈 }printf("此时栈的元素为:");Print(s);printf("\n进行一次左栈出栈:\n"); pop(s,1);printf("\n进行一次右栈出栈:\n"); pop(s,2); printf("\n此时栈的元素为:");Print(s);
}
7.运行如图:
在此声明:本文两个图是借用其他博主的图。
顺序栈和双向顺序栈的操作相关推荐
- (C语言版)栈和队列(二)——实现顺序存储栈和顺序存储队列的相关操作
http://blog.csdn.net/fisherwan/article/details/21479649 栈和队列都有两种实现方式,一种在之前已经写过了,是链式存储形式,另一种是顺序存储形式.也 ...
- java顺序栈和链栈_Java的顺序栈和链式栈
栈的定义 栈是限制在表的一段进行插入和删除的运算的线性表,通常能够将插入.删除的一端为栈顶,例外一端称为栈底,当表中没有任何元素的时候称为空栈. 通常删除(又称"退栈")叫做弹出p ...
- 21.判断栈弹出顺序是否正确
题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1 ...
- java 顺序栈_Java实现顺序栈
一.分析 栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表. 顺序栈是指利用顺序存储结构实现 ...
- 栈的push、pop序列-判断序列是否是栈的pop顺序
程序员面试题精选100题(24)-栈的push.pop序列[数据结构] 题目:输入两个整数序列.其中一个序列表示栈的 push 顺序,判断另一个序列有没有可能是对应的 pop 顺序.为了简单起见,我们 ...
- 数据结构--顺序表、链表、栈、队列、树、文件(visual studio可运行)
顺序表的顺序存储(增删查) #include <stdio.h> #include <stdlib.h> #define MaxSize 50 typedef int Elem ...
- 数据结构:顺序栈基本操作(入栈和出栈)C语言详解(转载)by解学武
本文为解学武教程的免费章节 什么是顺序栈 顺序栈,即用顺序表实现栈存储结构.通过前面的学习我们知道,使用栈存储结构操作数据元素必须遵守 "先进后出" 的原则,本节就 "如 ...
- 简述顺序表、链表、栈和队列以及队列实现栈、栈实现队列
简述顺序表.链表.栈和队列以及队列实现栈.栈实现队列 顺序表Vector 原理 使用方法 优点和缺点 链表List 原理 使用方法 优点和缺点 栈Stack 定义和特点 使用方法 队列 定义和特点 使 ...
- c语言堆栈基本代码入栈出栈_顺序栈基本操作(入栈和出栈)C语言详解
顺序,即用{1,2,3,4},存储状态如 图 1 顺序表存储 {1,2,3,4} 同样,使用栈存储结构存储 {1,2,3,4},其存储状态如图 2 所示: 图 2 栈结构存储 {1,2,3,4} 通过 ...
最新文章
- 【Python】在模仿中精进数据可视化09:近期基金涨幅排行可视化
- docker harbor 域名_超详细的搭建docker私服Harbor教程
- ant external lib
- Spring-Cloud中的 熔断、限流、降级
- 【转】OWIN是什么?
- check的用法java_Java ChronoField checkValidValue()用法及代码示例
- b - 数据结构实验之查找二:平衡二叉树_二叉树、平衡二叉树、红黑树、B树、B+树与B*树...
- html5积分墙联盟,积分墙是一种革新的移动广告联盟
- 培训班出身的程序员,未来何去何从?
- 微服务:服务治理来保证高可用
- 51驱动DS1302制作电子时钟1602显示
- 外汇天眼:开仓、平仓、持仓、锁仓是什么意思?
- 数学符号 - 罗马字母
- Centos7.3安装TP-LINK驱动 TL-WDN5200H
- AS安装模拟器要安装加速器
- 传统人工智能中的三大问题
- 说说Linux的用途
- w ndows无法连接到System,电脑无法连接到System Event Notification Service服务
- 传输速率、带宽、吞吐量
- 基于miu小波变换的人体步态数据检测和识别算法matlab仿真
热门文章
- Linux xz文件的压缩解压
- java计算机毕业设计vue图书档案管理系统MyBatis+系统+LW文档+源码+调试部署
- 脑电信号处理——加入通道注意力(利用可训练张量)
- PCG(preconditioned conjugate gradient)
- linux中dare命令,dare
- 回望过去三年(作为程序猿踏入社会的三年)
- Hadoop Day06~MapReduce计算json文件的电影总分
- 从零开始开发物联网项目(1)——mqtt服务器搭建
- ThinkPHP5 采集网页的指定内容
- python矩阵定义_python定义矩阵