顺序栈的C/C++语言实现
三部分文件:link.cpp link.h Test.cpp;
main函数在Test.cpp中,link.cpp为link.h的具体实现;
link.h
#pragma once
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#define SIZE 5
enum ERR_TYPE {TYPE_ERR = 1,TYPE_OK,TYPE_EMPTY,TYPE_FULL
};
typedef int data_t;
typedef struct Stack {data_t data[SIZE];int iTop;//栈顶下标
}Stack;
Stack* CreateStack();//创建空栈
int Push(Stack* pStack, data_t tdata);
int Pop(Stack* pStack, data_t* pData);//第二个参数是data_t*类型的;
int GetTop(Stack* pStack);
int IsEmpty(Stack* pStack);
int IsFull(Stack* pStack);
void Print(Stack* pStack);
link.cpp
#include"link.h"
Stack* CreateStack() {Stack* p = (Stack*)malloc(sizeof(Stack));if (p == NULL)return NULL;//void* memset(void* ptr, int value, size_t num);所以说malloc后面的括号有多大就memset多大memset(p, 0, sizeof(Stack));//memset(p,0,sizeof(p));errorp->iTop = -1;return p;
}
int Push(Stack* pStack, data_t tdata) {if (pStack == NULL)return TYPE_ERR;if (IsFull(pStack) == TYPE_FULL){printf("栈满了\n");return TYPE_FULL;}pStack->data[++pStack->iTop] = tdata;printf("插入了%d\n", pStack->data[pStack->iTop]);return TYPE_OK;
}
int Pop(Stack* pStack, data_t* pData) {if (pStack == NULL)return TYPE_ERR;if (IsEmpty(pStack) == TYPE_EMPTY){printf("栈为空\n");return TYPE_EMPTY;}*pData = pStack->data[pStack->iTop--];printf("%d出栈\n", *pData);return TYPE_OK;
}
int GetTop(Stack* pStack) {if (pStack == NULL)return TYPE_ERR;return pStack->iTop;
}
int IsEmpty(Stack* pStack) {if (pStack == NULL)return TYPE_ERR;return pStack->iTop == -1 ? TYPE_EMPTY : TYPE_OK;
}
int IsFull(Stack* pStack) {if (pStack == NULL)return TYPE_ERR;return pStack->iTop == SIZE-1 ? TYPE_FULL : TYPE_OK;
}
void Print(Stack* pStack) {for (int i = 0; i <= pStack->iTop; i++) {printf("%d\t", pStack->data[i]);}printf("\n");
}
Test.cpp
#include "link.h"
int main() {Stack* pStack = CreateStack();Push(pStack, 10);Push(pStack, 11);Push(pStack, 12);Push(pStack, 13);Push(pStack, 14);Print(pStack);int res;Pop(pStack, &res);Pop(pStack, &res);Pop(pStack, &res);Pop(pStack, &res);Pop(pStack, &res);}
//此类代码特别关心两个问题:
//入栈有可能满了?
//出栈有可能空了?