原理解释
代码示例
#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 20//栈的初始容量
#define STACKINCREMENT 10//栈的补充容量
typedef int ElementType;//使用ElementType类型名代替已知类型名
typedef struct {
ElementType *base;//base是栈底元素的地址
ElementType *top;//top - 1是栈顶元素的地址
int stackSize;//栈的大小
} sqStack;
void InitStack(sqStack *s) { //构造一个空栈,s是sqStack的一个地址,*s仅仅表示传入的应该是一个地址对应s
s->base = (ElementType *)malloc(STACK_INIT_SIZE * sizeof(ElementType));//开辟内存,并且把地址转换为int*形,存储在s->base中
if (!s->base) { //说明内存分配失败:NULL
printf("内存分配失败!");
exit(-1);//内存分配失败,程序退出
}
s->top = s->base;//让栈顶与栈尾指向同一位置
s->stackSize = STACK_INIT_SIZE;//指定栈的大小
}
ElementType GetTop(sqStack *s) { //返回栈顶元素
if (s->top == s->base) {
printf("空栈不能返回栈顶元素");
exit(-1);
}
return *(s->top - 1); //top指向的是栈顶元素的上一个位置,top-1指向的是栈顶元素
}
void Push(sqStack *s, ElementType e) { //实现入栈操作,其中e为待插入元素
if (s->top - s->base == s->stackSize) {//栈满,需要追加内存空间
s->base = (ElementType *)realloc(s->base, (STACK_INIT_SIZE + STACKINCREMENT) * sizeof(ElementType));
//重新分配动态存储区
if (!s->base) { //说明内存分配失败:NULL
printf("内存分配失败!");
exit(-1);//内存分配失败,程序退出
}
s->top = s->base + s->stackSize;//base指向改变,同样的top的值也应该改变
s->stackSize += STACKINCREMENT;//追加了存储空间,说明栈s的长度也发生了改变
}
*(s->top) = e;
(s->top)++;
}
void Pop(sqStack *s) {//出栈操作,删除栈顶元素
if (s->top == s->base) {
printf("空栈不能删除元素");
exit(-1);
}
(s->top)--;
}
void ShowStack(sqStack *s) {
if (s->top == s->base) {
printf("空栈没有元素");
exit(-1);
}
int i;
printf("栈内元素自顶向下的输出\n");
ElementType *temp = s->top;
while (1) {
temp--;
printf("%d ", *temp);
if (temp == s->base) {
break;
}
}
printf("\n\n");
}
int main() {
sqStack stk;
InitStack(&stk);//创建一个空栈
int choice,n,i,pushNum,isLoop=1;
printf("<<<已创建了一个空栈>>>");
while(isLoop) {
printf("\n输入 1-实现入栈操作,2-实现出栈操作,3-实现返回栈顶元素操作,4-退出\n");
scanf("%d",&choice);
switch(choice) {
case 1:
printf("*****实现入栈操作*****\n");
printf("输入准备给栈存储元素数量:");
scanf("%d", &n);
printf("输入n个元素值:");
for (i = 0; i < n; i++) {
scanf("%d", &pushNum);
Push(&stk, pushNum);
}
break;
case 2:
printf("*****实现出栈操作*****\n");
printf("请输入想删除元素数量:");
scanf("%d", &n);
for (i = 0; i < n; i++) {
Pop(&stk);
}
break;
case 3:
printf("*****实现获取栈顶元素操作*****\n");
printf("栈顶元素为:%d\n", GetTop(&stk));
break;
case 4:
isLoop = 0;
break;
default:
printf("输入错误,重新输入\n");
continue;
}
printf("**********************\n");
ShowStack(&stk);
}
}