数据结构:C_顺序栈的实现

数据结构顺序栈的实现(C语言版)



1.写在前面

  栈是一种遵循元素先进(Push)后出(Pop)规则的线性表,它的实现可以用数组或者链表。

  .....

2.代码分解

2.1对栈的结构定义:

typedef struct
{
   int *base;
   int *top;
   int stacksize;
}SqStack;

  |说明:

    1.base表示栈底指针,在判断出栈、初始化和重新分配空间的时候需要用到。

    2.top表示栈顶指针,是栈最关键和核心的组成,入栈时top向上移动,出栈时top向下移动。

    3.此处的stacksize并不表示当前的栈中的元素数量,而是表示栈的容量,也就是能装多少个元素。

2.2初始化栈:

int initStack(SqSatck *S)
{
    S->base=(int*)malloc(100*sizeof(int));
    if(!S)
         return 0; //0代表操作失败
    S->top=S->base;
    stacksize=100;
    return 1; //1代表操作完成
}

  |说明:

    1.顺序栈初始化无非就是给栈分配连续的内存空间,base是栈底指针,在上面提到过,它用来指示一段连续的内存空间的首地址,也就是用来初始化。

    2.分配空间不意味着一定会有那么多空间,所以判断也不可缺少。

    3.分配空间后,base和top的地址应该一致,此时top还没有移动。

2.3压栈

int push(SqStack * S,int elem)
{
  if(S->top-S->base>=S->stacksize)
  {
        S->base=(SElemType *)
                realloc(S->base,(S->stacksize+10)*sizeof(SElemType)); //10代表增量,你可以使用宏定义,方便后续修改。
        if(!S->base)
            return 0;
        S->top=S->base+S->stacksize;
        S->stacksize+=10
  }
  *S->top++=elem;
  return 1;
}    

   |说明:

    1.压栈是栈的核心操作,关键步骤无非是*S->top++=elem;但是在进行此步操作时,一定要判断栈是否超出容量。

    2.如果栈超出容量,则要在进行原空间的基础上重新分配空间,realloc是关键的命令。

  realloc 
    原型:extern void *realloc(void *mem_address, unsigned int newsize); 
    用法:#include <stdlib.h> 有些编译器需要#include <alloc.h> 
    功能:改变mem_address所指内存区域的大小为newsize长度。 
    说明:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。 
    当内存不再使用时,应使用free()函数将内存块释放。

    3.分配空间以后,在修改stacksize之前,top应该保持在容量顶端,S->top=S->base+S->stacksize;

2.4出栈

int pop(SqStack *q)
{
    if(S->top==S->base)
          return 0;
    return *S->--top;;
}

  |说明:

    1.出栈是简单操作,其实这里并没有完美的实现这个效果,你应该考虑到如果在扩容后又迅速减小,会造成大量的空间浪费。

2.5遍历栈

int printfStack(SqStack *S)
{
    int *p=S->base;
    puts("输出栈");
    for(p;p!=S->top;p++)
    {
        printf("***%d",*p);
    }
}

2.6演示代码

int main(int argc, char **argv)
{
    puts("fuck");
    SqStack myStack;
    InitStack(&myStack);
    CreatStack(&myStack);
    printfStack(&myStack);
    GetTop(&myStack);
    SElemType e;
    Pop(&myStack,100);
    push(&myStack,e);
}
时间: 2024-11-03 22:40:33

数据结构:C_顺序栈的实现的相关文章

浅谈数据结构之顺序栈(三)

栈:是限定仅在表尾进行插入与删除操作的线性表.我们把允许插入与删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的称为空栈.栈的插入操作,叫作进栈,也叫压栈.入栈,类似于子弹入弹夹:栈的删除操作,叫作出栈,也叫弹栈,如同弹夹中的子弹出夹.注意:栈的定义中的"表尾"指的是"栈顶",而不是"栈底". 首先,栈是一个线性表,也就是说:栈具有线性结构,即前驱后继关系:只不过它是一个特殊的线性表而已,它的特殊之处在于限制了这个线性表的插入与删除位置,它始

数据结构之顺序栈基本操作SqStack

顺序栈SqStack 基本操作 1 Status InitStack()//构造一个空栈S 2 Status DestroyStack()//销毁栈S,S不再存在 3 Status ClearStack()//把S置为空栈 4 Status StackEmpty()//若S为空栈,则返回true,否则返回false 5 int StackLength()//返回S的元素个数,即栈的长度 6 Status GetTop(SElemType &e)//若栈不空,则用e返回S的栈顶元素,并返回OK,否

【数据结构之顺序栈的基本运算】

//顺序栈 public class OrderStack { //(1)置空栈 void InitStack(SeqStack *S){ S->top = -1; } //(2)判断栈空 int StackEmpty(SeqStack *S){ return S->top == -1; } //(3)判断栈满 int StackFull(SeqStack *S){ return S->top == StackSize-1; } //(4)进栈 void push(S,x){ if(St

数据结构之顺序栈(C++版)

#include <iostream>#include <stdlib.h>#define MAXLISTSIZE 100 //预设的存储空间最大容量using namespace std; typedef string ElemType;typedef struct{ ElemType *base; //存储空间基址 int top; //栈顶指针 int stacksize; //允许的最大存储空间以元素为单位}Stack; void InitStack(Stack &

数据结构库——顺序栈的概念及实现

1,栈的定义: 1,栈是一种特殊的线性表: 2,栈仅能在线性表的一端进行操作: 1,栈顶(Top):允许操作的一端: 2,栈底(Bottom):不允许操作的一端: 2,栈的特性: 1,后进先出(Last In First Out)(只有一个特性): 3,栈的操作(创销进出顶大清): 1,创建栈(Stack()): 2,销毁栈(~Stack()): 3,进栈(push()): 4,出栈(pop()): 5,获取栈顶元素(top()): 6,获取栈的大小(size()): 7,清空栈(clear()

数据结构:顺序栈

这是严蔚敏吴伟民版本的算法,感觉没<大话数据结构>里面的简单易懂 这个版本里面的top指针指向下一个空单元格,这个其实是有些问题的,因为栈满的时候,top是指向栈外的,有些不安全. 1 #ifndef SQ_STACK_HEAD 2 #define SQ_STACK_HEAD 3 #include <stdio.h> 4 #include <stdlib.h> 5 #define Status int 6 #define OVERFLOW -1 7 #define OK

【数据结构】顺序栈的实现(c++)

头文件: #pragma once #include <iostream> #include <assert.h> using namespace std; template<class Type> class SeqStack { public: SeqStack(size_t sz = INIT_SZ); ~SeqStack(); public: bool empty()const; bool full()const; void show()const; bool

【数据结构】顺序栈

#include <STDIO.H> #include <STRING.H> #include <STDLIB.H> typedef struct SeqStack { int length; int top; char *data; }seqstack; seqstack* CreatStack(seqstack *s,int n) { s=(seqstack *)malloc(sizeof(seqstack)+n*sizeof(char)); if(s==NULL)

顺序栈的总结

基本数据结构之-顺序栈 栈是一种先进后出的数据结构,我们可以使用一个数组来模拟栈的这种结构,将数组的尾部当做栈的栈顶似乎是一个不错的选择(插入和移除元素是不涉及到数据的移动),也可以很好的控制数组的长度,和数据的进栈和出栈! 首先先解析一下顺序栈的数据结构 1 需要一个数据域来存储数据 考虑到可能存储自定义的数据类型,所以我们选择存储每个数据的开始的地址 (void **stack) 2 需要一个值来记录当前的数据域的长度 (size) 3 需要一个值来记录当前的容器的长度 typedef st