算法与数据机构入门经典(栈)

1.栈

   栈(Stack)是一种线性存储结构,它具有如下特点:

         栈中的数据元素遵守先进后出(First In Last Out)的原则。

        栈被限定只能在栈顶进行插入与删除操作。

        标注的栈包括以下5个操作:

           a,将某元素 添加到栈

           b。取出栈顶 元素 (取出不删除)

          c  弹出 栈顶元素 (删除的意思)

          d。判断 栈是否为空

           e。求栈存储元素个数


  

上面的五个操作是o(1)的复杂度,和栈的元素数目没有关系。

2.链表实现栈

  使用链表实现栈,将 链表头节点 变成栈顶元素,所有栈操作变为基于 链表头节点 的操作。


                   

                            

3、栈的基本操作,入栈操作

                                        

                                         

如图上所示意思。入栈操作,将某元素添加至栈中:

      a。 新建 节点,做相应赋值。

      b。将新节点的 next指针指向当前 栈顶元素。

      c。将新节点设置为栈顶节点。

      d。修改栈中元素个数

 代码:

        

就算是空栈也是可以的啦!

4.出栈操作

                                            

                                 

                       

代码:

                         


5.栈的其他基本操作

                    

        

                                          

6.栈的基本操作,代码测试。

   

#include "malloc.h"
#include <stdio.h>
// 单链表的数据结构
typedef struct ListNode ListNode;
struct ListNode {
	int data;  
	ListNode *next;
};
typedef struct Stack Stack;
struct Stack {
	ListNode *top_node;//栈顶元素的指针
	int size;      //栈中元素个数                                                                     
};

//入栈
void stsck_push(Stack *stack, int val) {
	ListNode *new_node = (ListNode*)malloc(sizeof(ListNode));
	new_node->data = val;
	new_node->next =  stack->top_node;
	stack->top_node = new_node;
	stack->size += 1;
}

 //出栈
void stack_pop(Stack *stack) {
	if (!stack->top_node) {    //判断栈是否为空
		return;
	}
	ListNode *top_node = stack->top_node; //备份栈顶指针指向的节点地址
	stack->top_node = stack->top_node->next;//这句不会写呀 修改栈顶指针,使其指向栈顶下方的元素
	stack->size -= 1; // 修改栈中元素个数
	free(top_node); // 释放原栈顶节点
}

 //返回栈顶元素,将栈顶元素输出返回
int stack_top(Stack* stack) {
	return stack->top_node->data;
}

//  返回栈的大小,返回栈中有多少个元素
int stack_size(Stack *stack) {
	return stack->size;
}
// 判断栈是否为空,是否栈为空
int stack_is_empty(Stack *stack) {
	return stack->top_node == NULL;
}
//打印
void stack_print(Stack * stack){
	printf("Stack:\n");
	ListNode *p = stack->top_node;
	while (p) {
		printf("[%d]\n", p->data);
		p = p->next;
	}

}

int main() {
	Stack stack;
	stack.top_node = NULL;
	stack.size = 0;
	stsck_push(&stack, 4);
	stsck_push(&stack, 5);
	stsck_push(&stack, 6);
	stack_print(&stack);
	printf("Stack Top value is %d\n", stack_top(&stack));
	printf("Stack size is %d\n", stack_size(&stack));
	printf("Stack empty is %d\n", stack_is_empty(&stack));
	printf("\n");
	
	stack_pop(&stack);
	stack_pop(&stack);
	stack_print(&stack);
	printf("Stack Top value is %d\n", stack_top(&stack));
	printf("Stack size is %d\n", stack_size(&stack));
	printf("Stack empty is %d\n", stack_is_empty(&stack));
	printf("\n");

	stack_pop(&stack);
	stack_print(&stack);
	printf("Stack size is %d\n", stack_size(&stack));
	printf("Stack empty is %d\n", stack_is_empty(&stack));
    
	return 0;
}

 划横线的地方 大家注意啦,我上面的代码截图中有些写错啦,所以在这完整的代码中给着重标出来了,大家也注意了啊!!不会写的地方也要多揣摩,弄明白。

                                               

猜你喜欢

转载自blog.csdn.net/qq_37791134/article/details/80868670