一个数组构造两个堆栈

***用一个数组表示两个堆栈,最大限度的利用空间

0 1 2 3

若果像右图中从中间分成两部分,则可能存在其中一个堆栈满了,而另一个堆栈还有空的,为你最大限度的利用空间,需要两边像中间长,知道指针碰头表示堆栈已满

#include<iostream>
using namespace std;
#define Maxsize 100
class stack
{
public:
int a[Maxsize];
int top1;
int top2;
};
void push(stack&A, int x, int Tag);
int pop(stack&A, int Tag);
int main()
{
stack A;
A.top1 = -1; //从数组开头开始长
A.top2 = Maxsize; //从数组末尾长
return 0;
}
void push(stack&A, int x, int Tag)
{
if (A.top2 - A.top1 == 1){ //这样才能最大限度的利用数组空间
cout << "堆栈已满";
return;
}
if (Tag == 1){ //Tag==1表示前面一个堆栈
A.top1++;
A.a[A.top1] = x;
}
else{
A.top2--;
A.a[A.top2] = x;
}
}
int pop(stack&A, int Tag)
{
if (Tag == 1){
if (A.top1 == -1){
cout << "堆栈已空" << endl;
return 0;
}
int l = A.a[A.top1];
A.top1--;
return l;
}
else{
if (A.top2 ==Maxsize){
cout << "堆栈已空" << endl;
return 0;
}
int m = A.a[A.top2];
A.top1++;
return m;
}
}

时间: 2024-10-13 10:26:22

一个数组构造两个堆栈的相关文章

包含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(

用一个数组实现两个堆栈

#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代表

算法导论 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; }

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

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

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

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

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

已知一个数组a[N]来构造数组b[N]的有趣算法题

给定一个数组a[N],我们希望构造数组b[N],其中b[i]=a[0]*a[1]*...*a[N-1]/a[i].在构造过程要求满足:1.不使用除法:2.O(1)空间复杂度和O(n)时间复杂度:3.除遍历a[N] b[N]使用的计数器外,不使用任何新的变量(包括栈临时变量.对空间和全局静态变量等): /**********************************************/ /* 给定一个数组a[N],我们希望构造数组b[N],其中b[i]=a[0]*a[1]*...*a[