数据结构--栈的思想与数组实现

    栈是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈的顶,对栈的基本操作有进栈(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;
}

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

      夜深了,天似乎变黑了。

 

posted on 2017-04-16 21:01  wu_xin  阅读(274)  评论(0编辑  收藏  举报

导航