2.1.1线性表实现栈的建立,入栈,出栈等操作

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

#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10
#define OK 1
#define ERROR 0
#define OVERFLOW -1

typedef int status;
typedef int SElemType;

typedef struct
{
    SElemType *base;//在构造之前和销毁之后,base的值为NULL
    SElemType *top;//栈顶指针
    int stacksize;//当前分配的存储空间,以元素为单位
}SqStack;

//构造一个空栈
status InitStack(SqStack &S)
{
    S.base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
    if(!S.base)exit(OVERFLOW);
    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE;
    return OK;
}

//输出栈顶元素
status GetTop(SqStack &S, SElemType &e)
{
    if(S.top == S.base) return ERROR;
    e = *(S.top-1);
    return OK;
}

//元素入栈
status Push(SqStack &S, SElemType e)
{
    if(S.top - S.base >= S.stacksize)
    {
        S.base =(SElemType*)realloc(S.base, (S.stacksize + STACK_INCREMENT)*sizeof(SElemType));
        if(!S.base) exit(OVERFLOW);
        S.top = S.base+S.stacksize;
        S.stacksize = S.stacksize + STACK_INCREMENT;
    }
    *S.top++ = e;
    return OK;
}

//元素出栈
status Pop(SqStack &S, SElemType &e)
{
    if(S.top == S.base) return ERROR;
    e = *--S.top;
    return OK;
}

//*************测试程序***********************//
int main()
{
    SqStack s;
    int e;
    if(InitStack(s)) printf("Init succeed!\n");
    if(Push(s, 4)) printf("Push succeed!\n");
    if(Push(s, 2)) printf("Push succeed!\n");
    if(GetTop(s, e)) printf("Get succeed!\n");
    printf("%d\n", e);
    if(Pop(s,e)) printf("Pop succeed!\n");
    printf("%d\n",e);
   return 0;
}

时间: 2024-12-19 15:09:52

2.1.1线性表实现栈的建立,入栈,出栈等操作的相关文章

判断一个字符串是否为回文-链队(新建,进队,出队),链栈(新建,进栈,出栈)

回文:字符对称排列的字符串,例如ABCBA 思路:根据队:先进先出和栈: 先进后出的原则,进行比较出队和出栈的字符是否相等.如果相等,则为回文. 创建控制台应用程序. 1 #region 字符节点类 2 class CharNode 3 { 4 public char Char //字符 5 { 6 get; 7 set; 8 } 9 public CharNode Next //下一节点 10 { 11 get; 12 set; 13 } 14 public CharNode(char Cha

栈与队列问题1——出栈序列

问题描述:栈是常用的一种数据结构,有n个元素在栈顶端一侧等待进栈,栈顶端另一侧是出栈序列.你已经知道栈的操作有两种:push和pop,前者是将一个元素进栈,后者是将栈顶元素弹出.现在要使用这两种操作,由一个操作序列可以得到一系列的输出序列.请你编程求出对于给定的n,计算并输出由操作数序列1,2,…,n,经过一系列操作可能得到的输出序列总数. 分析:之前就有看过这种问题.就是火车进站问题,判断序列是否合法,当时是用STL栈做的.这个题只需统计次数,那么,方法就十分简便了,递归和动归都可以实现,当然

栈的实现,入栈判断是否Full,出栈判断是否Empty

#栈的实现,入栈判断是否Full,出栈判断是否Empty class Stack(): def __init__(st,size): st.stack=[]; st.size=size; st.top=-1; def push(st,content): if st.Full(): print "Stack is Full!" else: st.stack.append(content) st.top=st.top+1 def Out(st): if st.Empty(): print

【剑指offer】栈的压入弹出序列

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26077863 剑指offer上的第22题,九度OJ上AC. 题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列. 输入: 每个测试案例包括3行: 第一行为1个整数n(

剑指Offer:栈的压入/弹出序列

栈的压入/弹出序列 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列.(注意:这两个序列的长度是相等的) class Solution { public: bool IsPopOrder(vector<int> pushV,vector<int> popV) { //

实现一个栈,要求实现Push(入栈)、Pop(出栈)、Min(返回最小值的操作)的时间复杂度为O(1)

具体实现如下: #include<iostream> #include<stack> #include<string> #include<assert.h> using namespace std; template<class T> class Stack { public: void Push(const T& x); void Pop(); T& Min(); void PrintS(); private: stack<

剑指Offer20 栈的压入弹出序列是否正确

1 /************************************************************************* 2 > File Name: 20_IsPopOrder.cpp 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年08月30日 星期二 19时53分19秒 6 **************************************

【35】栈的压入弹出判断

题目: 给定两个整数序列,第一个序列是栈的压入序列,判断第二个是不是栈的弹出序列?假设不重复,比如1,2,3,4,5和4,5,3,2,1 思路: 如果下一个弹出的数字刚好是栈顶数字,那么弹出.不在栈顶,持续压入,知道弹出的数字和栈顶一样,如果压完,还没找到,那么返回false. 代码: boolean isPopOrder(int[] push,int[] pop,int length){ boolean possible = false; int i = 0; int j = 0; Stack

九度 1366 栈的压入弹出序列

题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列. 输入: 每个测试案例包括3行: 第一行为1个整数n(1<=n<=100000),表示序列的长度. 第二行包含n个整数,表示栈的压入顺序. 第三行包含n个整数,表示栈的弹出顺序. 输出: 对应每个测试案例,如果第二个序列是