1、顺序栈的实现
#include <stdio.h>
#include <malloc.h>
typedef int Status;
typedef char SElemType;
#define stack_INIT_SIZE 100 //定义栈空间大小
#define stackINCREMENT 10
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef struct {
SElemType *base; //栈底指针
SElemType *top; //栈顶指针
int stacksize; //栈空间
}Sqstack;Status iniStack(Sqstack &S) //初始化栈
{//构造一个空栈S
S.base=(SElemType*)malloc(stack_INIT_SIZE * sizeof(SElemType));
if(!S.base)return(ERROR);
S.top=S.base; //栈顶指针指向栈底指针表示栈为空
S.stacksize=stack_INIT_SIZE;
return OK;
}//InitStackStatus push(Sqstack &S,SElemType x) //入栈
{
//栈不满的情况下进行入栈操作
if(S.top-S.base>=S.stacksize){
S.base=(SElemType * )realloc(S.base,
(S.stacksize+stackINCREMENT)*sizeof(SElemType));
if(!S.base)return(ERROR);
S.top=S.base+S.stacksize; //设置栈顶指针位置
S.stacksize+=stackINCREMENT; //累积入栈元素空间
}
*S.top++=x; //先入栈,指针再加1
return OK;
}Status pop(Sqstack &S,SElemType &e) //出栈
{
//栈不空时进行出栈操作
if(S.top==S.base)return ERROR;
e=*--S.top; //指针先减1,再出栈
return OK;
}int main()
{
Sqstack S;
SElemType k;
iniStack(S); //栈初始化
if(push(S,'A')==ERROR) //入栈
printf("入栈失败!\n");
if(push(S,'B')==ERROR) //入栈
printf("入栈失败!\n");
if(push(S,'C')==ERROR) //入栈
printf("入栈失败!\n");
if(pop(S,k)==ERROR) //出栈
printf("出栈失败!\n");
else
printf("出栈元素为:%c\n",k);
if(pop(S,k)==ERROR) //出栈
printf("出栈失败!\n");
else
printf("出栈元素为:%c\n",k);
return 0;
}
2、链式栈的实现
// 链栈
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>typedef int ElemType;
typedef struct LinkNode{
ElemType data;
struct LinkNode *next;
}LinkNode, *LiStack;// 初始化
bool InitStack(LiStack *S){
(*S) = (LiStack)malloc(sizeof(LinkNode)); // 申请空间
if(*S == NULL) return false; // 分配失败
(*S)->next = NULL; // 初始指向空
return true;
}// 入栈(结点头插)
bool Push(LiStack S, ElemType e){
LinkNode *p = (LinkNode*)malloc(sizeof(LinkNode));
if(S->next == NULL){ // 判断栈空
// 先创建第一个结点
p->data = e;
p->next = NULL; // 后继指向空
S->next = p;
}else{ // 后续结点都是在头结点和第一个结点之间插入
p->next = S->next; // p指向头指针原后继
p->data = e; // 存入数据
S->next = p; // 头指针后继指向p
}
return true;
}// 创建栈
bool CreateStack(LiStack S){
ElemType e;
scanf("%d", &e); // 读入数据
while(e != 9999){ // 输入9999停止
Push(S, e); // 调用入栈函数进行入栈
scanf("%d", &e); // 读入数据
}
return true;
}// 出栈
bool Pop(LiStack S, ElemType *e){
if(S == NULL || S->next == NULL) return false;
LinkNode *p = S->next;
S->next = p->next; // 指向下一个结点
free(p);
return true;
}// 读取栈顶元素
bool GetTop(LiStack S, ElemType *e){
if(S == NULL) return false;
*e = S->next->data; // 栈顶元素赋给e通过指针传回主函数
return true;
}// 输出栈
void PrintStack(LiStack S){
LinkNode *p;
p = S->next;
while(p != NULL){ // 遍历栈
printf("%d ", p->data); // 输出数据域
p = p->next;
}
printf("\n");
}
int main(){
LiStack S; // 声明
InitStack(&S); // 初始化
int status; // 操作码
ElemType e; // 元素
while(1){
printf("Please enter a status code:\n1.CreateStack 2.Push 3.Pop\n");
printf("4.GetTop 5.PrintStack 0.Exit\n");
scanf("%d", &status);
if(status == 0) break;
switch (status){
case 1: // 创建栈
printf("Please enter the elements one by one in order!\n");
CreateStack(S);
PrintStack(S);
break;
case 2: // 入栈
printf("Please enter the element value you want to push\n");
scanf("%d", &e);
if(Push(S, e)){
printf("Push successfully!\n");
}else{
printf("Failed to Push!\n");
}
PrintStack(S);
break;
case 3: // 出栈
if(Pop(S, &e)){
printf("Element value %d Pop successfully\n", e);
}else{
printf("Failed to Pop!\n");
}
PrintStack(S);
break;
case 4: // 读取栈顶元素
if(GetTop(S, &e)){
printf("The top elem is %d\n", e);
}else{
printf("The LiStack is empty!\n");
}
break;
case 5: // 输出表
PrintStack(S);
break;
default:
printf("Error!\n");
break;
}
}
return 0;
}