zoukankan      html  css  js  c++  java
  • 数据结构--栈的思想与数组实现

        栈是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈的顶,对栈的基本操作有进栈(Push)和出栈(Pop),前者就是插入操作,后者就是删除操作,由于只能在一端进行删除或者插入操作,因此栈中的数据是后进先出的,如下图所示:

        栈的实现可以通过链表实现,也可以通过数组实现,通过数组实现的代码如下:

       

    #include <iostream>
    #include <stdlib.h>
    using namespace std;
    
    typedef struct StackRecord* Stack;
    #define EmptyTos -1      //栈是否为空的标志位
    #define MinStackSize 10  //栈的最小容量为10
    
    struct StackRecord
    {
       int Capacity;   //栈的容量
       int TopOfStack;   //栈的顶端
       int *Array;     //一个数组
    };
    //////////////////函数声明///////////////////
    int IsEmpty(Stack s);    //检查一个栈是否为空
    int IsFull (Stack s);     //检查一个栈是否满了
    void MakeEmpty (Stack s);  //创建一个空栈的“栈底”
    Stack CreatStack (int MaxElements);   //创建一个栈,大小为MaxElements
    void DisposeStack (Stack s);    //释放一个栈
    void Push(int x, Stack s);   //进栈
    int Pop(Stack s);     //出栈,返回栈顶元素
    int Top(Stack s);    //返回栈顶元素,不出栈
    
    
    //////////////////函数定义///////////////////
    int IsEmpty(Stack s)
    {
       return s->TopOfStack == EmptyTos;
    }
    
    int IsFull (Stack s)
    {
       if(s->TopOfStack > s->Capacity )
       {
          cout << "stack full" << endl;
    	   return 1;
       }
       else
       {
          return 0;
       }
    }
    
    void MakeEmpty (Stack s)
    {
       s->TopOfStack = EmptyTos;
    }
    
    Stack CreatStack (int MaxElements)
    {
       Stack s;
       if (MaxElements < MinStackSize)
       {
          cout << "stack size is too small" << endl;
       }
       s = static_cast<Stack> (malloc(sizeof(struct StackRecord)));
       if(s == NULL)
       {
          cout << "out of space!!!";
       }
       s->Array =static_cast<int*>(malloc(sizeof(int)*MaxElements));
       if(s->Array == NULL)
       {
         cout << "out of space!!!";
       }
       s->Capacity = MaxElements;
       MakeEmpty(s);
       return s;
    }
    
    void DisposeStack (Stack s)
    {
       if (s != NULL)
       {
          free(s->Array );
    	  free(s);
       }
    }
    
    void Push(int x, Stack s)
    {
    	if(IsFull(s))
    	{
    	   cout << "Full stack" << endl;
    	}
    	else
    	s->Array [++(s->TopOfStack )] = x;
    }
    
    int Pop(Stack s)
    {
       if(!IsEmpty(s))
       {
          return s->Array [(s->TopOfStack)--];
       }
       else
       {
           cout << "Empty stack " << endl;
    	   return -1;
       }
    }
    
    int Top(Stack s)
    {
    	 if(!IsEmpty(s))
       {
          return s->Array [s->TopOfStack];
       }
       else
       {
           cout << "Empty stack " << endl;
    	   return -1;
       }
    }
    
    int main ()
    {
    	///////////测试栈////////////////
       Stack stack_1 = CreatStack (15);
       Push(23, stack_1);   //进栈
       Push(56, stack_1);
       Push(78, stack_1);
       int num = Pop(stack_1); 
       int num2 = Pop(stack_1); 
       int num3 = Pop(stack_1); 
       cout << Top(stack_1) << endl;
       return 0;
    }
    

      微机原理里面讲到的栈也是这个意思,因此理解栈的概念最重要。

          夜深了,天似乎变黑了。

  • 相关阅读:
    bzoj 2257 (JSOI 2009) 瓶子与燃料
    bzoj 2257 (JSOI 2009) 瓶子与燃料
    splay 模板 洛谷3369
    费用流 模板 洛谷3381
    bzoj 1024 [SCOI2009]生日快乐——模拟
    bzoj 3231 [Sdoi2008]递归数列——矩阵乘法
    hdu 5823 color II——子集dp(独立集)
    bzoj 1093 [ZJOI2007]最大半连通子图——缩点+拓扑
    洛谷 3959 宝藏——枚举+状压dp
    bzoj 1034 [ZJOI2008]泡泡堂BNB——贪心
  • 原文地址:https://www.cnblogs.com/1242118789lr/p/6719947.html
Copyright © 2011-2022 走看看