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

本题要求在一个数组中实现两个堆栈。

函数接口定义:

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 {
    ElementType *Data;
    Position Top1, Top2;
    int MaxSize;
};
typedef struct SNode *Stack;

注意:如果堆栈已满,Push函数必须输出“Stack Full”并且返回false;如果某堆栈是空的,则Pop函数必须输出“Stack Tag Empty”(其中Tag是该堆栈的编号),并且返回ERROR。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

#define ERROR 1e8
typedef int ElementType;
typedef enum { push, pop, end } Operation;
typedef enum { false, true } bool;
typedef int Position;
struct SNode {
    ElementType *Data;
    Position Top1, Top2;
    int MaxSize;
};
typedef struct SNode *Stack;

Stack CreateStack( int MaxSize );
bool Push( Stack S, ElementType X, int Tag );
ElementType Pop( Stack S, int Tag );

Operation GetOp();  /* details omitted */
void PrintStack( Stack S, int Tag ); /* details omitted */

int main()
{
    int N, Tag, X;
    Stack S;
    int done = 0;

    scanf("%d", &N);
    S = CreateStack(N);
    while ( !done ) {
        switch( GetOp() ) {
        case push:
            scanf("%d %d", &Tag, &X);
            if (!Push(S, X, Tag)) printf("Stack %d is Full!\n", Tag);
            break;
        case pop:
            scanf("%d", &Tag);
            X = Pop(S, Tag);
            if ( X==ERROR ) printf("Stack %d is Empty!\n", Tag);
            break;
        case end:
            PrintStack(S, 1);
            PrintStack(S, 2);
            done = 1;
            break;
        }
    }
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

5
Push 1 1
Pop 2
Push 2 11
Push 1 2
Push 2 12
Pop 1
Push 2 13
Push 2 14
Push 1 3
Pop 2
End

输出样例:

Stack 2 Empty
Stack 2 is Empty!
Stack Full
Stack 1 is Full!
Pop from Stack 1: 1
Pop from Stack 2: 13 12 11
Stack CreateStack(int MaxSize)
{
/*  in most case I need to use (if or else) to judge the malloc operation whether success or not  */
    Stack Sh = (Stack) malloc(sizeof(struct SNode));
    Sh->Data = (ElementType *)malloc(sizeof(int) * MaxSize);
    Sh->Top1 = -1;
    Sh->Top2 = MaxSize;
    Sh->MaxSize = MaxSize;
    return Sh;
};
bool Push (Stack S, ElementType x, int Tag)
{
    if(S == NULL)
        return false;
    if((S->Top1 + 1 ) == S->Top2)
    {
        printf("Stack Full\n");
        return false;
    }
    if(1 == Tag)
    {
        ++(S->Top1);
        S->Data[ (S->Top1) ] = x;
        return true;
    }
    else if (2 == Tag)
    {
        --(S->Top2);
        S->Data[ (S->Top2) ] = x;
        return true;
    }
    return false;
};
ElementType Pop( Stack S, int Tag )
{
    if(S == NULL)
        return ERROR;
    if(1 == Tag)
    {
        if(-1 == S->Top1)
        {
            printf("Stack %d Empty\n", Tag);
            return ERROR;
        }
        return (S->Data[ (S->Top1)-- ]);
    }
    else if(2 == Tag)
    {
        if(S->MaxSize == S->Top2)
        {
            printf("Stack %d Empty\n", Tag);
            return ERROR;
        }
        return ( S->Data[ (S->Top2)++ ]);
    }
    return ERROR;
};
时间: 2024-12-09 23:03:22

4-7 在一个数组中实现两个堆栈的相关文章

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

6-7 在一个数组中实现两个堆栈 (20 分)

题目地址:https://pintia.cn/problem-sets/15/problems/730 Pop函数成功弹出后应该返回弹出的值,否则就是错的,应该是和PrintStack函数有关 Stack CreateStack(int Maxsize) { Stack S = (Stack)malloc(sizeof(struct SNode)); S->Data = (int *)malloc(sizeof(ElementType)* Maxsize); S->MaxSize = Maxs

在一个数组中除两个数字只出现1次外,其它数字都出现了2次

前面总结了leecode上,改为成3出现,只有1个出现1次,的是通过记录每个位的个数来实现的如果count%3=1则为1,否则为0,实现起来充分利用了位运算. 编程之美上的,没有写过,今天写一下. http://blog.csdn.net/morewindows/article/details/8214003这个博客是MVP的博客,我自己也写一遍,其实核心就是 两个数的异或为1,只有1,0疑惑才为1,所以分离这两个数到不同的区间.对如何寻找1的位置做了优化(x&-x) #include<io

每日一题16:在一个数组中实现两个栈

在一个数组中实现两个栈,当数组未填满是任一个栈不能溢出.解法是将一个栈从头开始往后插入,而另一个从后往前插入,如果插入一个元素后,两个栈的top指针未相遇,则表示数组未满,栈没有溢出. #include "stdafx.h" #include <iostream> using namespace std; struct special_stack { int capcity; int ltop,rtop; int* vals; }; special_stack* creat

在一个数组中查找两个重复出现的数字

题目如下:现有一个数组长度为n+1,里面存放有1到n-2,顺序不定,其中有两个数字出现了两次,现在要找出那两个数字. 例子A={2, 3, 1, 4, 5, 2, 4}, 这个数组长度为7,存放了1到5,但2和4出现了两次,程序输出2和4 方法1 蛮力查找 主要思想:对于数组中的第i个数,查找i+1到末尾的所有整数,一个数如果出现了两次就可以在第一次后面找到第二次出现的数. 时间复杂度 O(n^2) #include<stdio.h> void find_duplicates(int* num

面试题:在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找出这两个数字

由于有一个数字消失了,那必定有一个数只出现一次而且其它数字都出现了偶数次.用搜索来做就没必要了,利用异或运算的两个特性—— 1.自己与自己异或结果为0 2.异或满足交换律. 因此我们将这些数字全异或一遍,结果就一定是那个仅出现一个的那个数. 示例代码如下: int[] arra = {11,12,3,12,11,12,12 }; static void Main(string[] args) { int[] arra = {11,12,3,12,11,12,12 }; int lostNum =

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

vuex中filter的使用 &amp;&amp; 快速判断一个数是否在一个数组中

vue中filter的使用 computed: mapState({ items: state => state.items.filter(function (value, index, arr) { return index < 5 }) }), 如上所示,对于vuex,我们在使用mapState获取state时, 可以使用filter来过滤其中的元素,在filter的回调函数中接受三个参数,第一个是value,即每一个元素的值: 第二个是index, 即每一个元素所在的index, 第三个

获取在一个数组中出现最多的字符及其所在的位置

获取在一个数组中出现最多的字符.个数及其所在的位置 <!DOCTYPE html> <html> <head> <title>一个数组中,出现次数最多的字符,及其位置</title> </head> <body> <script type="text/javascript"> var arr=["a","x","b","d