完成一个栈总共需要完成以下操作:
初始化
入栈
出栈
查看栈顶元素
查看栈的容量
清空栈。
首先是简单的,用数组做的,会有越界的可能。
#include <stdio.h>
#include <stdlib.h>
typedef struct Stack {
int data[100];
int top;
} Stack;
Stack * s ;
// 生成栈
void initStack(){
s = (Stack *)malloc(sizeof(Stack));
s->top = -1;
}
// 入栈,push
void push(int data){
if(s->top + 1 >= 100){
printf("超出了栈的最大容量,入栈失败\n");
return;
}
s->top ++;
s->data[s->top] = data;
}
// 出栈,pop
void pop(){
if (s->top == -1){
printf("此栈已经是空栈了\n");
return;
}
printf("数据 %d 即将出栈\n",s->data[s->top]);
s->top--;
}
// 清空栈
void clearStack(){
while (s->top >=0){
pop();
}
}
// 获取栈顶元素
void topItem(){
if (s->top==-1){
printf("此栈为空栈\n");
return;
}
printf("此栈中元素数量为 %d 个,栈顶为 %d\n",s->top+1,s->data[s->top]);
}
int main()
{
initStack();
topItem();
push(3);
push(7);
push(1);
push(8);
push(13);
topItem();
pop();
clearStack();
topItem();
}
用链表做的,理论上无上限,除非计算机内存都用完了。
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Stack * next;
} Node;
typedef struct Stack {
Node * data;
int count;
} Stack;
Stack * s ;
// 生成栈
void initStack(){
s = (Stack *)malloc(sizeof(Stack));
s->count = 0;
s->data = NULL;
}
// 入栈,push
void push(int data){
Node * n = malloc(sizeof(Node));
n->data = data;
n->next = s->data;
s->data = n;
s->count ++;
}
// 出栈,pop
void pop(){
if(s->data == NULL) {
printf("已经是空栈了");
return;
}
Node * n = s->data;
printf("数据 %d 即将出栈\n",n->data);
s->data=n->next;
free(n);
s->count--;
}
// 清空栈
void clearStack(){
while (s->data != NULL) {
pop();
}
}
// 获取栈顶元素
void topItem(){
if (s->data==NULL){
printf("此栈为空栈\n");
return;
}
printf("此栈中元素数量为 %d 个,栈顶为 %d\n",s->count,s->data->data);
}
int main()
{
initStack();
topItem();
push(3);
push(7);
push(1);
push(8);
push(13);
topItem();
pop();
push(222);
pop();
clearStack();
topItem();
}
计算机的函数调用就是采用了栈结构,还有逆波兰表达式(可以算加减乘除和括号)的算法都用到了栈结构。