【 数据结构(C语言)】栈——顺序实现

栈:栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行。

/**
**  2017.11.3
**  Ahthor:799
**  栈的顺序实现
**
***/
#include <bits/stdc++.h>
using namespace std;
#define STACK_INIT_SIZE 100 /// 存储空间初始分配
#define STACK_INCREMENT 10 /// 存储空间分配增量
#define ElemType int
#define Status int
#define OK 1
#define ERROR -1
#define OVERFLOW -2
typedef struct
{
    ElemType *base;
    ElemType *top;
    int stacksize;
} SqStack;
Status InitStack (SqStack &S)
{
    S.base = (ElemType * )malloc(STACK_INIT_SIZE * sizeof(ElemType));
    if (!S.base) exit(OVERFLOW);
    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE;
    return OK;
}
Status DestroyStack(SqStack &S)
{
    for (ElemType *index = S.base; index != S.top; index ++)
    {
        free(index);
    }
    free(&S);
    return OK;
}
Status ClearStack(SqStack &S)
{
    for (ElemType *index = S.base+1; index != S.top; index ++)
    {
        free(index);
    }
    S.top = S.base;
    return OK;
}
Status IsEmptyStack(SqStack &S)
{
    if (S.base == S.top) return true;
    else return false;
}
Status LengthStack(SqStack &S)
{
    return S.top - S.base;
}
ElemType  GetTop(SqStack &S)
{
    if (S.top == S.base) return ERROR;
    ElemType e = *(S.top - 1);
    return e;
}
Status Push(SqStack &S,ElemType &e)
{
    if (S.top - S.base >= S.stacksize)
    {
        S.base = (ElemType *) realloc (S.base,(S.stacksize + STACK_INCREMENT) * sizeof(ElemType));
        if (!S.base)exit(OVERFLOW);
        S.top = S.base + S.stacksize;
        S.stacksize += STACK_INCREMENT;
    }
    *S.top = e;
    S.top ++;
    return OK;
}
Status Pop(SqStack &S, ElemType &e)
{
    if (S.top == S.base) return ERROR;
    e = * --S.top;
    return OK;
}
Status TrverseStack(SqStack &S)
{
    for (ElemType *index = S.base; index != S.top; index ++)
    {
        cout<<*index<<" ";
    }
    cout<<endl;
    return OK;
}
int main()
{
    SqStack * St = (SqStack *) malloc(sizeof(SqStack));
    InitStack (*St);
    int n;
    cin>>n;
    while (n--)
    {
        int tmp;
        cin>>tmp;
        Push(*St,tmp);
    }
    int num;
    Pop(*St,num);
    cout<<" num "<<num<<endl;
    TrverseStack(*St);
    cout<<" top "<<GetTop(*St)<<endl;
    cout<<" len : "<<LengthStack(*St)<<endl;
    ClearStack(*St);
    if (IsEmptyStack(*St)) cout<<" kong "<<endl;
    else cout<<" no "<<endl;
    return 0;
}

  

时间: 2024-10-10 00:17:33

【 数据结构(C语言)】栈——顺序实现的相关文章

数据结构(C语言版)顺序栈相关算法的代码实现

这两天完成了栈的顺序存储结构的相关算法,包括初始化.压栈.出栈.取栈顶元素.判断栈是否为空.返回栈长度.栈的遍历.清栈.销毁栈.这次的实现过程有两点收获,总结如下: 一.清楚遍历栈的概念 栈的遍历指的是从栈底想栈顶方向运行visit()函数,这是之前的学习中所忽略的:栈的遍历解除了栈的输出顺序只能从栈顶像栈底方向的限制. 二.清空栈时要不要将stacksize重置 网上看到有的人在实现清空栈这一功能时,将stacksize重置为0,我觉得有点问题,起初的想法是将其重置为初始化时的值,在与同学讨论

数据结构(java语言描述)顺序栈的使用(两个大数相加)

利用http://www.cnblogs.com/xleer/p/5289661.html中对顺序栈以及栈的进本方法的定义,实现超过整数上限的两个数的加法计算. 算法: package stack;/********************************************************************** * @author sch ********利用栈,计算两个大数的和.大数的值超过int存储的范围******************************

数据结构(C语言版)顺序表相关算法代码实现

这两天实现了一下顺序表的相关操作,包括顺序表初始化.创建.遍历.第i个元素前插入,删除第i个元素.查找元素e的位置.清空顺序表.销毁顺序表.合并两个非递减顺序表操作. 这次在网上学习到了新的布局方法,将顺序表的存储结构定义,函数说明部分放在了头文件里,源文件中实现的是主函数和各功能函数. 这次使用的编译环境是vc++6.0 //头文件部分 #define LIST_INIT_SIZE 5 #define INCREAMENT 5 typedef char Elemtype; typedef in

数据结构经典问题——出栈顺序 转载至:canlynet微博

对于数据结构的问题,如果思路稍有不对,就容易陷入逻辑混乱.我希望自己对数据结构的理解,能够给大家一点帮助.我会将所有我有过心得的问题在我的博客上写出来,欢迎大家浏览,如果有什么不对的地方,还请大家指正,有问题可以给我留言,我会尽量解决,谢谢. 声明一下我写博客的初衷:不是炫耀,而是回报.因为我在计算机方面的知识好多都从网上找到答案,因此我也 将自己搜寻整理的材料,自己写的材料,展示到网上,算是尽一份力吧. 一个经典问题如下(不愿意看思路的可以直接看红色字体部分): 一个栈的入栈序列是a,b,c,

C语言函数参数压栈顺序为何是从右到左?(从左向右的话,碰到printf的会陷入死循环)

上学期学习了汇编语言,并在操作系统实验中使用了汇编+C语言混合编程,中间也了解了一些C语言与汇编语言的对应关系. 由于汇编语言是底层的编程语言,各种函数参数都要直接控制栈进行存取,在混合编程中,要用汇编来调用C函数,当然就要知道参数的压栈情况了. 当知道C函数的参数压栈顺序是从右到左时,我觉得很奇怪,因为大多数情况下,人们的习惯是从左到右的,难不成设计者学咱们中国古代写字从右到左的习惯不成? 当时只是记下了这个规则而已,并没有去探究这其中的缘由,后来在实验中自己用汇编实现了printf和scan

数据结构c语言版 栈

栈栈是限定仅在表尾进行插入或删除操作的线性表.表头端称栈底.表尾端称栈顶. (1)先进后出(2)top = base 表示栈空(3)非空栈中的栈顶指针始终在栈顶元素的下一个位置上,如上图(4)若base = null 表明栈结构不存在 栈的实现代码 1 #include<stdio.h> 2 #include<stdlib.h> 3 #define STACK_INIT_SIZE 100 4 #define STACKINCREMENT 10 5 typedef int Statu

数据结构C语言实现介绍

刚刚结束的大二上学期学习了数据机构C语言版这门课,在接下来的一个月中准备把课程的代码和知识点总结一下,就有了这个专题:数据结构C语言实现,在这里我将用C语言实现最基本的数据结构以及一些基本的算法,以下是我这个专题的内容: 1. 数据结构及算法简介: 主要介绍数据结构及算法的基础知识,一些基本的概念和术语,以及算法的定义.算法的特性.算法的时间复杂度和空间复杂度 2.顺序表的定义及算法实现: 主要介绍顺序表的定义及特点,实现顺序表的存储结构以及基本操作 3.单链表的定义及算法实现:  主要介绍单链

n个元素进栈,共有多少种出栈顺序?

原文:http://blog.csdn.net/zyearn/article/details/7758716 近日在复习数据结构,看到栈的时候,发现1个元素进栈,有1种出栈顺序:2个元素进栈,有2种出栈顺序:3个元素进栈,有5种出栈顺序,那么一个很自然地问题就是n个元素进栈,共有多少种出栈顺序? 说来惭愧,以前学数据结构的时候竟然没有考虑过这个问题.最近在看动态规划,所以“子问题”这3个字一直在我脑中徘徊,于是解决这个问题的时候我也是用类似“子问题”的方法,说白了就是递推公式. 我们把n个元素的

数据结构C语言实现——线性链表

declaration.h #ifndef DECLARATION_H_INCLUDED #define DECLARATION_H_INCLUDED #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define ElemType int typedef ElemType* Triplet; typedef int Status; type

java数据结构与算法之顺序表与链表深入分析

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52953190 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 ??数据结构与算法这门学科虽然在大学期间就已学习过了,但是到现在确实也忘了不少,因此最近又重新看了本书-<数据结构与算法分析>加上之前看的<java数据结构>也算是对数据结构的进一步深入学习了,于是也就打算