数据结构--栈的思想与数组实现
栈是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈的顶,对栈的基本操作有进栈(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; }
微机原理里面讲到的栈也是这个意思,因此理解栈的概念最重要。
夜深了,天似乎变黑了。