双栈结构

一 代码结构

二 代码详解

1. doublestack.h

/*************************************************************************
    > File Name: doublestack.h
    > Author: wangzhicheng
    > Mail: [email protected]
    > Created Time: Mon 16 Feb 2015 10:35:07 AM WST
 ************************************************************************/
#ifndef DOUBLESTACK_H
#define DOUBLESTACK_H
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <iostream>
#include <memory>
using namespace std;

template<class T>
class Double_stack {
	private:
		int top0;
		int top1;
		const int n;
		T *array;
	public:
		Double_stack();
		bool empty() const;
		bool full() const;
		bool push(const T&);
		bool pop(T &);
		~Double_stack();
};

#endif

2. doublestack.cpp

/*************************************************************************
    > File Name: doublestack.cpp
    > Author: wangzhicheng
    > Mail: [email protected]
    > Created Time: Mon 16 Feb 2015 09:53:20 PM WST
 ************************************************************************/

#include "doublestack.h"
template<class T>
Double_stack<T>::Double_stack():n(1024) {
	this->top0 = -1;
	this->top1 = n;
	this->array = new T(n);
	if(!this->array) {
		cerr << "memory lack...!" << endl;
		exit(EXIT_FAILURE);
	}
}
template<class T>
bool Double_stack<T>::empty() const {
	return this->top0 == -1 && this->top1 == n;
}
template<class T>
bool Double_stack<T>::full() const {
	return this->top0 + 1 == this->top1;
}
template<class T>
bool Double_stack<T>::push(const T& m) {
	if(this->full()) {
		cerr << "the stack is full...!" << endl;
		exit(EXIT_FAILURE);
	}
	static int choice;
	if(!choice) {
		this->top0++;
		this->array[top0] = m;
	}
	else {
		this->top1--;
		this->array[top1] = m;
	}
	choice = (choice + 1) & 1;
}
template<class T>
bool Double_stack<T>::pop(T& m) {
	if(this->empty()) {
		cerr << "the stack is empty...!" << endl;
		exit(EXIT_FAILURE);
	}
	static int choice;
	if(!choice) {
		m = this->array[top0];
		this->top0--;
	}
	else {
		m = this->array[top1];
		this->top1++;
	}
	choice = (choice + 1) & 1;
}
template<class T>
Double_stack<T>::~Double_stack() {
	delete this->array;
	this->top0 = -1;
	this->top1 = n;
}

3. main.cpp

/*************************************************************************
    > File Name: main.cpp
    > Author: wangzhicheng
    > Mail: [email protected]
    > Created Time: Mon 16 Feb 2015 10:20:01 PM WST
 ************************************************************************/
#include "doublestack.cpp"
int main() {
	Double_stack<int>doublestack;
	doublestack.push(1);
	doublestack.push(2);
	doublestack.push(3);
	int m;
	doublestack.pop(m);
	cout << m << endl;

	return 0;
}

4. makefile

CC=g++
all:
	$(CC) -g -o main main.cpp doublestack.cpp doublestack.h

三 程序运行截图

时间: 2024-11-05 02:55:01

双栈结构的相关文章

日常学习随笔-数组、单链表、双链表三种形式实现栈结构的基本操作

一.栈结构 栈(stack)是限制插入和删除只能在一个位置上的表,该位置是 表的末端,叫做栈的顶(Top).对栈的基本操作有push(进栈),pop(出栈),peak(栈顶元素),size(栈容量)等. 栈的核心思想:"先进后出". 二.案例一:数组实现"栈" 1 package com.xfwl.algorithmAnalysis.stack; 2 3 import java.util.Arrays; 4 5 /** 6 * 自定义栈结构(基于数组的形式) 7 *

JBoss7配置之支持IPv4和IPv6双栈环境

由于实验室项目需要,将EJB 3.0的程序部署在JBoss AS 7.1.1.Final中,并要求支持IPv4与IPv6.但其默认配置并不支持IPv6,于是查阅JBoss Community Documentation,即官方文档,在5.4.1 Interfaces and ports节中找到了相关介绍,研究后对JBoss进行配置修改,使JBoss中EJB 3.0的程序能够在IPv4和IPv6双栈环境下正常运行,包括客户端在IPv4环境下获取Remote远程接口对象,调用远程对象的方法收发IPv

第11章 拾遗4:IPv6和IPv4共存技术(1)_双栈技术和6to4隧道技术

6. IPv6和IPv4共存技术 6.1 双栈技术 (1)双协议主机的协议结构 (2)双协议栈示意图 ①双协议主机在通信时首先通过支持双协议的DNS服务器查询与目的主机名对应的IP地址. ②再根据指定的IPv6或IPv4地址开始通信. ③Win2008或2003默认就是双协议栈,Win2008的DNS同是支持IPv4和IPv6的名称解析. 6.2 6to4隧道技术 (1)6to4隧道示意图 ①隧道技术使得各个IPv6的信息"孤岛"能通过IPv4网络进行通信.它要求隧道两端的节点(路由器

AC日记——双栈排序 洛谷 P1155

双栈排序 思路: 二分图染+模拟: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1005 #define maxm 2000005 int n,head[maxn],E[maxm],V[maxm],cnt,col[maxn]; int minn[maxn],ai[maxn],sta1[maxn],sta2[maxn],top1,top2; bool if_[maxn][maxn]; inline void in(

NOIP2008 双栈排序

题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1不为空,将S1栈顶元素弹出至输出序列 操作c 如果输入序列不为空,将第一个元素压入栈S2 操作d 如果栈S2不为空,将S2栈顶元素弹出至输出序列 如果一个1~n的排列P可以通过一系列操作使得输出序列为1,2,…,(n-1),n,Tom就称P是一个“可双栈排序排列”.例如(1,3,2,4)就是一个“可

BZOJ 2080: [Poi2010]Railway 双栈排序

2080: [Poi2010]Railway Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 140  Solved: 35[Submit][Status][Discuss] Description 一个铁路包含两个侧线1和2,右边由A进入,左边由B出去(看下面的图片) 有n个车厢在通道A上,编号为1到n,它们被安排按照要求的顺序(a1,a2,a3,a4....an)进入侧线,进去还要出来,它们要按照编号顺序(1,2,3,4,5....n)从通道B

二分图 and code1170 双栈排序

6.6二分图 二分图是这样一个图: 有两顶点集且图中每条边的的两个顶点分别位于两个顶点集中,每个顶点集中没有边直接相连接. 无向图G为二分图的充分必要条件是,G至少有两个顶点,且其所有回路的长度均为偶数. 判断二分图的常见方法是染色法: 开始对任意一未染色的顶点染色,之后判断其相邻的顶点中,若未染色则将其染上和相邻顶点不同的颜色, 若已经染色且颜色和相邻顶点的颜色相同则说明不是二分图,若颜色不同则继续判断,bfs和dfs都可以. 易知:任何无回路的的图均是二分图. 代码: bool Color(

NOIP2008 双栈排序 染色+模拟

挺不错的一道题,首先可以知道若存在形如 k<i<j 但 a[k]<a[i]<a[j]这样的,那么i,j一定不能(从始至终不能)进入同一个栈 例如 2 3 1,若2 3进入同一个栈,那么1再进栈然后马上出栈,这时候,2没有办法在3之前出来. 所以对于这样的i,j我们连一条边,然后dfs染色,若染色中发现相邻点颜色相同,则无解,否则我们按照1,2,1,2的顺序染色. 确定了每一个数属于哪个栈后,用2个stack模拟一下就好了. #include <iostream> #in

闭关修炼中 *** Java常用算法之 -- 栈结构

什么是栈结构: 栈结构从数据的运算来分类,栈结构具有特殊的运算规则. 从数据的逻辑结构来看,栈结构其实就是一种线性结构. but!!! 从数据的存储结构来划分,栈结构分为两类: 顺序表结构:即用一组地址连续的内存单元依次保存栈中的数据.在程序中,可以定义一个 指定大小的结构数组来作为栈,序号为0的元素就是栈底,在定义一个top保 存栈顶的序号. 链式栈结构:即使用链式形式保存栈中各元素的值.链表首部(head引用所指向元素)为栈顶, 链表尾部(指向地址为null)为栈底. 栈结构遵循:后进先出(