栈结构实现C语言
- FILO,先入栈的元素后出栈。
- 栈顶标记
基本操作有:入栈,出栈,获取栈顶元素,判断栈是否为空。
数组栈,链式栈。
链式栈的具体实现代码
#include <stdio.h>
#include <stdlib.h>
//链式栈数据结构
//
/**
* 用栈顶标识链表的表头
* 链表的头插法,就是入栈操作
*/
/*typedef struct LNode{
int data;
struct LNode* next;
}LinkList ,*LNode;*/
struct LNode{
int data;
struct LNode* next;
};
struct Stack{
struct LNode* stacktop;//栈顶标记
int size;//栈中的元素个数
};
//创建栈就是创建栈的结构体变量
struct Stack* create_stack(){
//创建过程其实就是初始化过程
struct Stack* MyStack = (struct Stack*)malloc(sizeof(struct Stack));//分配初始空间
MyStack -> stacktop = NULL;
MyStack -> size = 0;
return MyStack;
}
//我们需要创建节点
struct LNode* create_node(int data){
struct LNode* node = (struct LNode*)malloc(sizeof(struct LNode));
node->data = data;
node->next = NULL;
return node;
}
//入栈操作(节点进入栈)
void push_stack(int data,struct Stack* MyStack){
struct LNode* newNode = create_node(data);
if(MyStack -> stacktop == NULL){
MyStack->stacktop = newNode;
}else{
newNode->next = MyStack->stacktop;
MyStack->stacktop = newNode;
}
MyStack->size++;
printf("入栈成功\n");
}
//出栈操作,传入一个是执行出栈操作的栈,另一个是存放出栈节点data的temp
void pop_stack(struct Stack* MyStack,int temp){
if(MyStack->size == 0){
printf("栈为空\n");
}else if (MyStack->stacktop->next == NULL){
MyStack->size--;
printf("最后一个元素出栈成功\n");
}else {
MyStack->stacktop = MyStack->stacktop->next;
temp = MyStack->stacktop->data;
MyStack->size--;
printf("出栈成功,出栈节点值保存在temp中\n");
}
}
void print_stack(struct Stack* MyStack){
struct Stack* temp = MyStack;
while (temp->stacktop){
printf("%d\n",temp->stacktop->data);
temp->stacktop = temp->stacktop->next;
}
}
int isempty(struct Stack* MyStack){
if (MyStack->size == 0){
return 1;//返回1则为空
}else return 0;//返回0则不为空
}
int main() {
struct Stack* MyStack = create_stack();
int temp;
push_stack(1,MyStack);
push_stack(2,MyStack);
push_stack(3,MyStack);
push_stack(4,MyStack);
printf("现在栈中的元素有%d个\n",MyStack->size);
//print_stack(MyStack);
pop_stack(MyStack,temp);
pop_stack(MyStack,temp);
pop_stack(MyStack,temp);
pop_stack(MyStack,temp);
printf("现在栈中的元素有%d个\n",MyStack->size);
//具体实现方法很简单,不管用循环与否都可
return 0;
}
数组栈的初始化,入栈以及出栈操作C语言实现
#include <stdlib.h>
#define MAX 10
/**
* 数组栈要定义的属性和方法:
* 栈指针,栈顶索引,栈的MAX值
* @return
*/
struct Array_Stack{
int *MysStack;//作为数组指针,用来存储数组栈中的元素
int StackTop;
};
//创建初始化数组栈
struct Array_Stack* createStack(){
struct Array_Stack* array_stack = (struct Array_Stack*)malloc(sizeof(struct Array_Stack));
//栈的容量
array_stack->MysStack = (int *)malloc(sizeof(int)*MAX);
//栈的标记正好等于数组下标,则没有元素时标记为-1
array_stack->StackTop = -1;
return array_stack;
}
//入栈操作
void push(struct Array_Stack* array_stack,int data) {
array_stack->MysStack[++array_stack->StackTop] = data;
printf("入栈成功");
}
void pop(struct Array_Stack* array_stack){
if(array_stack->StackTop == -1){
return;
}else{
free(array_stack->MysStack[array_stack->StackTop]);
array_stack->StackTop--;
}
}
int main(){
struct Array_Stack* stack = createStack();
push(stack,1);
push(stack,2);
push(stack,3);
push(stack,4);
return 0 ;
}
便于各个方法实现,和理解数据结构。