用一个数组实现两个堆栈

#include <stdio.h>
#include <stdlib.h>
#define ElementType int
const int MAXSIZE = 10;
typedef struct Node *DStack;
typedef struct Node{
	ElementType Data[MAXSIZE];
	int last0;
	int last1;
};

bool Push(int flag,DStack &S, ElementType X){//0代表插入栈0,1代表插入栈1
	//printf("------------------------------------\n");
	if(S->last0==S->last1-1){
		printf("栈满\n");
		return 0;
	}
	//printf("------------------------------------\n");
	if(flag==0){
		S->Data[++S->last0] = X;
		return true;
	}else if(flag == 1){
		S->Data[--S->last1]=X;
		return true;
	}else{
		printf("插入序号有误\n");
		return false;
	}
}
ElementType Pop(int flag,&DStack S){
	if((flag==0 && S->last0==-1)||(flag==1 && S->last1 == MAXSIZE)){
		printf("栈空");
		return 0;
	}
	if(flag ==0)
		return S->Data[S->last0--];
	else if(flag ==1)
		return S->Data[S->last1++];
	else{
		printf("插入序号有误\n");
		return 0;
	}
}
void InintDStack(DStack &S){
	S = (DStack)malloc(sizeof(struct Node));
	S->last0 = -1;
	S->last1= MAXSIZE;
}
int main(){
	DStack S;
	InintDStack(S);

	for(int i = 0;i<12;i++){
		Push(i%2,S,i);
	}
	for(int i=0;i<12;i++){
		printf("%d\n",Pop(i%2,S));
	}
	return 0;
}

  

时间: 2024-08-05 03:16:14

用一个数组实现两个堆栈的相关文章

包含MIN函数的栈+一个数组实现两个堆栈+两个数组实现MIN栈

1.题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 思路:利用一个辅助栈来存放最小值 栈  3,4,2,5,1 辅助栈 3,2,1 每入栈一次,就与辅助栈顶比较大小,如果小就入栈,如果大就不入栈当前的辅助栈:当出栈时,辅助栈元素相等时也要出栈. class Solution { public: stack<int> mystack1;//辅助栈 stack<int> minstack;//最小栈 void push(int value) { if(

一个数组构造两个堆栈

***用一个数组表示两个堆栈,最大限度的利用空间 0 1 2 3 若果像右图中从中间分成两部分,则可能存在其中一个堆栈满了,而另一个堆栈还有空的,为你最大限度的利用空间,需要两边像中间长,知道指针碰头表示堆栈已满 #include<iostream>using namespace std;#define Maxsize 100class stack{public: int a[Maxsize]; int top1; int top2;};void push(stack&A, int x

算法导论 10.1-2 用一个数组实现两个栈

一.题目 用一个数组A[ 1....N ]实现两个栈,除非数组的每一个单元都被使用,否则栈例程不能有溢出,注意PUSH和POP操作的时间应为O(1). 二.解法 对于一个数组,由它的两端作为栈底,栈向数组中间扩展.当数组中每个元素被用到时,栈满. 三.代码 struct Node; typedef Node *ComStack; struct Node { int Capacity; int TopL; int TopR; ElementType *Array; }; ComStack Crea

一个数组实现两个栈

//1.两个栈栈头在数组头尾(利用率高) //2.两个栈栈头在数组中间(利用率低) //3.奇偶下标分别为两栈(扩容时复制数据简单) //实现1 template<class T> class Stack { public: Stack() :_array(NULL) , _q1Size(0) , _q2Size(0) , _capacity(0) {} ~Stack() { delete[] _array; _q1Size = _q2Size = _capacity = 0; } void 

平分一个数组为两个数组的方法

function averarr($arr[]){ $length=$arr.length; $length1=Math.ceil($length/2); $arr1=array(); $arr2=array(); for($i=0;i<$length1;i++){ $arr1[i]=$arr[i]; } return $arr1; for($i=$length1;i<$length;i++){ $arr2[i]=$arr[$lengh1+1]; } return $arr2; }

6-7 在一个数组中实现两个堆栈

6-7 在一个数组中实现两个堆栈(20 分) 本题要求在一个数组中实现两个堆栈. 函数接口定义: Stack CreateStack( int MaxSize ); bool Push( Stack S, ElementType X, int Tag ); ElementType Pop( Stack S, int Tag ); 其中Tag是堆栈编号,取1或2:MaxSize堆栈数组的规模:Stack结构定义如下: typedef int Position; struct SNode { Ele

数据结构与算法分析 3.23 — 用一个数组实现三个(多个)栈

一.题目 用一个数组实现三个(或多个)栈 二.解答 用一个数组实现三个乃至多个栈,如果想使用一个数组构造两个栈的思想则行不通: 考虑使用静态链表,数组结点中存在两个域,关键字域与指示栈的前驱的游标,则可以使三个栈可以用一个数组表示: ADT的关键术语: Capacity: 数组的容量: Size: 数组已经存储的数据元素个数: Top_Fst:First栈的栈顶: 三.代码 struct Node; typedef struct Node ElementType; typedef struct

面试题1:找出一个数组中三个只出现一次的数字

version1: 找出一个数组中一个只出现一次的数字,其他数字都出现两次:将所有数字异或,得到的结果即为只出现一次的. version2: 找出一个数组中两个只出现一次的数字,其他数字都出现两次:将所有数字异或,得到的结果即为x=a^b, index为x中第一个为1的位,则a 和b中第index为必然有一个为1,有一个为0.据此将所有数据分为两组,一组的第index为都为1,另一组第index为都为0,第一组数字异或得到a,第二组数字异或得到b. 时间复杂度为o(n),空间复杂度为o(1).

程序员面试100题之十:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值(转)

能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解. 假如有如下的两个数组,如图所示: 5,6,1,4,7,9,8 给定Sum= 10 1,5,6,7,8,9 给定Sum= 10 分析与解法 这个题目不是很难,也很容易理解.但是要得出高效率的解法,还是需要一番思考的. 解法一 一个直接的解法就是穷举:从数组中任意取出两个数字,计算两者之和是否为给定的数字. 显然其时间复杂度为N(N-1)/2即O(N^2).这个算法很简