练习3.21 一个数组两个站栈

#include<stdio.h>
#include<stdlib.h>
struct Node;
typedef struct Node *PtrToDStack;

struct Node{
    int top1,top2;
    int Capacity;
    int  *Array;
};

PtrToDStack
CreateStack( int Size )
{
    PtrToDStack s;
    s = malloc( sizeof( struct Node ) );
    s->Array = malloc( sizeof( int ) * Size );
    s->Capacity = Size;
    return s;
}

void
Initial( PtrToDStack s, int k )
{
    if( k = 0 )
        s->top1 = -1;
    else
        s->top2 = s->Capacity;
}

int
IsEmpty( PtrToDStack s, int k )
{
    if( k == 0 )
        return s->top1 == -1;
    else
        return s->top2 == Size;
}

int
IsFull( PtrToDStack s )
{
    return s->top1 + 1 == s->top2;
}

void
Push( PtrToDStack s, int k, int x )
{
    if( !IsFull( s ) )
    {
        if( k == 0 )
            s->Array[ ++s->top1 ] = x;
        else
            s->Array[ --s->top2 ] = x;
    }
    else
        Error("stack is full");
}

void
Pop( PtrToDStack s, int k )
{
    if( k == 0 )
    {
        if( !IsEmpty( s, 0 ) )
            s->top1--;
        else
            Error("");
    }
    else
    {
        if( !IsEmpty( s, 1 ) )
            s->top2--;
        else
            Error("no ele")
    }
}

int
Top( PtrToDStack s, int k )
{
    if( k == 0 )
    {
        if( !IsEmpty( s, k ) )
            return s->Array[ s->top1 ];
        else
            Error;
    }
    else
    {
        if( !IsEmpty(s,k) )
            return s->Array[ s->top2 ];
        else
            Error;
    }
}

个人觉得在Top和Pop处IsEmpty有点冗杂,下次把两个指针都放进一个数组里面top[0],top[1]分别表示左栈和右栈

代码的复用一下就高了

单数组双栈迎面镇长的好处:可以最大化利用数组,减少溢出(我不造)

我猜在push里面,IsFull的判断,如果满了,就发出溢出声明

时间: 2024-08-30 16:53:29

练习3.21 一个数组两个站栈的相关文章

OC动态创建的问题变量数组.有数组,在阵列13要素,第一个数据包阵列,每3元素为一组,分成若干组,这些数据包的统一管理。最后,一个数组.(要动态地创建一个数组).两种方法

<span style="font-size:24px;">//////第一种方法 //        NSMutableArray *arr = [NSMutableArray array]; //        for (int i = 0; i < 13; i ++) { //            [arr addObject:[NSString stringWithFormat:@"lanou%d",i + 1]]; //        

scala 对一个数组分组操作

通常我们有一些需求,对一个数组两两进行翻转,通常就涉及到奇数偶数,否则就会出现数组index异常了,所以我们该怎么办呢? 虽然是一个入门级问题,但是我还是觉得这是一个很有意思的题目,因此写了一个对于通用count 数组的操作,以后做题可以直接复制粘贴. val arr1 = Array(1, 2, 3, 4, 5) val arr2 = ArrayBuffer[Int]() val num = 3 for(i <- 0 until(arr1.length /num+1);j = i*num;k

c++数组类模板(栈内存)

#ifndef _ARRAY_H_ #define _ARRAY_H_ /* * 实现一个数组类模板,在栈上 * why * 2016/9/5 */ template < typename T, int N > class Array { private: T m_array[N]; public: int length(); //获取数组长度 bool set_array(T value, int index);  //设置数组元素内容 bool get_array(T& value

js实现随机选取[10,100)中的10个整数,存入一个数组,并排序。 另考虑(10,100]和[10,100]两种情况。

1.js实现随机选取[10,100)中的10个整数,存入一个数组,并排序. 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 </head> 7 <body> 8 <script type="text/java

求一个数组当中最大(最小)值的两种计算方法

求一个数组当中最大(最小)值的两种计算方法 1.常用方法(以求最大值为例) 1 #include "stdafx.h" 2 #include <string> 3 using namespace std; 4 int _tmain(int argc, _TCHAR* argv[]) 5 { 6 int a[5] = { 1, 23, 2, 6, 7 }; 7 int array_length = sizeof(a) / sizeof(a[0]);//数组大小 8 int m

C语言:一个数组中只有两个数字是出现一次

1 //1.一个数组中只有两个数字是出现一次, 2 //其他所有数字都出现了两次. 3 //找出这两个数字,编程实现.a 4 5 //^=单独两个数的^结果 6 //单独出现的两个数不同位的标记 7 //position: ^结果中第一个出现1的位置 8 //position位两个数肯定有一个为0 ,一个为1 9 //把数组分成两部分 10 //1:position为1 11 //2:position为0 12 //每一部分都有一个只出现一次的数字,其他的都是成对出现 13 //每一部分^结果为

给定一个数组,求如果排序之后,相邻两数的最大差值,要求时 间复杂度O(N),且要求不能用非基于比较的排序

思路: 桶排序 N个数,设置 N+ 1 个桶,,一定有一个空桶,,为的是保证最大差值一定是不是出现在同一个桶中: 只要比较 非空桶 的最小值,与前一个 非空桶的最大值,求 最大的差值, 1 package my_basic; 2 3 import java.text.Bidi; 4 import java.util.Arrays; 5 6 public class MaxGap { 7 8 /*给定一个数组,求如果排序之后,相邻两数的最大差值,要求时 间复杂度O(N),且要求不能用非基于比较的排

程序员面试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).这个算法很简

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