https://blog.csdn.net/CSDN___CSDN/article/details/82918436
- 1 #include <stdio.h>
- 2 #include <stdlib.h>
- 3
- 4 typedef struct link_node
- 5 {
- 6 int info;
- 7 struct link_node *next;
- 8 }N;
- 9
- 10 /*创建一个空的链式栈*/
- 11 N *init()
- 12 {
- 13 return NULL;
- 14 }
- 15
- 16 /*对链式栈进行初始化*/
- 17 N *creat(N *top)
- 18 {
- 19 int x;
- 20 N *p;
- 21 printf("以输入-1为结束\n");
- 22 scanf("%d",&x);
- 23 while(x!=-1)
- 24 {
- 25 p=(N*)malloc(sizeof(N));
- 26 p->info=x;
- 27 p->next=top;
- 28 top=p;
- 29 scanf("%d",&x);
- 30 }
- 31 return top;
- 32 }
- 33
- 34 /*取得链式栈的栈顶结点值*/
- 35 int read(N *top)
- 36 {
- 37 if(!top)
- 38 {
- 39 printf("\n该链式栈是空的\n");
- 40 }
- 41 return top->info;
- 42 }
- 43
- 44 /*输出链式栈中各结点的值*/
- 45 void display(N *top)
- 46 {
- 47 N *p=top;
- 48 if(!top)
- 49 {
- 50 printf("该链式栈是空的\n");
- 51 }
- 52 else
- 53 {
- 54 while(p)
- 55 {
- 56 printf("%d ",p->info);
- 57 p=p->next;
- 58 }
- 59 printf("\n");
- 60 }
- 61 }
- 62
- 63 /*链式栈的插入操作*/
- 64 N *insert(N *top,int x)
- 65 {
- 66 N *q=top,*p;
- 67 p=(N*)malloc(sizeof(N));
- 68 p->info=x;
- 69 p->next=top;
- 70 top=p;
- 71 return top;
- 72 }
- 73
- 74 /*链式栈的删除操作*/
- 75 N *dele(N *top)
- 76 {
- 77 N *p=top;
- 78 if(!top)
- 79 {
- 80 printf("\n该链式栈是空的,无法进行删除\n");return NULL;
- 81 }
- 82 top=top->next;
- 83 free(p);
- 84 return top;
- 85 }
- 86
- 87 int main()
- 88 {
- 89 N* top = init();
- 90 top = creat(top);
- 91 display(top);
- 92 int i = read(top);
- 93 printf("%d\n",i);
- 94 top = insert(top,5);
- 95 display(top);
- 96 top = dele(top);
- 97 display(top);
- 98
- 99 return 0;
- 100 }
https://blog.csdn.net/zichen_ziqi/article/details/80807989
- 1 #include <iostream>
- 2 using namespace std;
- 3
- 4 template <class T>
- 5 class stack{
- 6 private:
- 7 struct Node{
- 8 T data;
- 9 struct Node *next;
- 10 };
- 11 Node *head;
- 12 int len;
- 13 public:
- 14 stack()
- 15 {
- 16 head = NULL;
- 17 len = 0;
- 18 }
- 19 //创建一个栈
- 20 void create()
- 21 {
- 22 int x;
- 23 Node *p;
- 24 cout << "以输入-1为结束" << endl;
- 25 cin >> x ;
- 26 while(x!=-1)
- 27 {
- 28 p=new Node;
- 29 p->data=x;
- 30 p->next=head;
- 31 head=p;
- 32 cin >> x ;
- 33 len++;
- 34 }
- 35 }
- 36 //入栈
- 37 void push(T x)
- 38 {
- 39 Node *q = new Node;
- 40 q->data = x;
- 41 q->next = head;
- 42 len++;
- 43 }
- 44 //出栈
- 45 T top()
- 46 {
- 47 Node *p;
- 48 T data;
- 49 data = head->data;
- 50 p = head;
- 51 head = head->next;
- 52 delete(p);
- 53 len--;
- 54 return data;
- 55 }
- 56 //返回栈内元素的个数
- 57 int size()
- 58 {
- 59 return len;
- 60 }
- 61 };
- 62
- 63 int main()
- 64 {
- 65 stack<int> s;
- 66 s.create();
- 67 s.push(7);
- 68 cout << s.size() << endl;
- 69 cout << s.top() << endl;
- 70 cout << s.size() << endl;
- 71
- 72 return 0;
- 73 }
3.用两个栈实现队列的功能
https://blog.csdn.net/weixin_40671425/article/details/83006485
- 1 #include<stdio.h>
- 2 #include<stdlib.h>
- 3
- 4 #define STACK_INIT_SIZE 10
- 5
- 6 typedef struct stack{
- 7 int *base;
- 8 int *top;
- 9 int stacksize;
- 10 }stack;
- 11
- 12 int initStack(stack *s)//构造一个空栈
- 13 {
- 14 s->base = (int *)malloc(sizeof(stack)*STACK_INIT_SIZE);
- 15 if(s->base == NULL)
- 16 exit(-1);
- 17 s->top = s->base;
- 18 s->stacksize = STACK_INIT_SIZE;
- 19 return 1;
- 20 }
- 21
- 22 void push(stack *s,int num)//压栈
- 23 {
- 24 *s->top++ = num;//注意 优先级
- 25 }
- 26
- 27 int pop(stack *s)//弹栈
- 28 {
- 29 if(s->base == s->top)//空栈,无栈可弹
- 30 return -1;
- 31 return *(--s->top);
- 32 }
- 33
- 34 int main()
- 35 {
- 36 stack s1,s2;
- 37 initStack(&s1);
- 38 initStack(&s2);
- 39 int nums[] = {1,2,3,4,5,6};
- 40 printf("压入栈 1\n");
- 41 for(int i=0;i<6;i++)
- 42 {
- 43 push(&s1,*(nums + i));
- 44 }
- 45 printf("出队的顺序为:\n");
- 46 for(int i=0;i<6;i++)
- 47 {
- 48 push(&s2,pop(&s1));
- 49 }
- 50 for(int i=0;i<6;i++)
- 51 {
- 52 printf("%d \t",pop(&s2));
- 53 }
- 54 return 0;
- 55 }
https://blog.csdn.net/ltc0106/article/details/105779396
- 1 #include <stdio.h>
- 2 #include <stdlib.h>
- 3
- 4 #define STACK_TYPE int
- 5
- 6 typedef struct STACK_NODE
- 7 {
- 8 STACK_TYPE value;
- 9 struct STACK_NODE *next;
- 10 struct STACK_NODE *next_min;
- 11 }Stack_Node;
- 12
- 13 //data栈
- 14 static Stack_Node *stack;
- 15 //只指向最小数的栈
- 16 static Stack_Node *stack_min;
- 17
- 18 void create_stack()
- 19 {
- 20 stack = NULL;
- 21 stack_min = NULL;
- 22 }
- 23
- 24 void push(int value)
- 25 {
- 26 Stack_Node *new_node;
- 27 new_node = (Stack_Node *)malloc(sizeof(Stack_Node));
- 28 //更新data栈
- 29 new_node->value = value;
- 30 new_node->next = stack; //单向循环链表
- 31 stack = new_node;
- 32 //更新min栈
- 33 if(stack_min == NULL ||value < stack_min->value )
- 34 {
- 35 new_node->next_min = stack_min;
- 36 stack_min = new_node;
- 37 }
- 38 else
- 39 {
- 40 new_node->next_min = NULL;
- 41 }
- 42 }
- 43
- 44 int pop()
- 45 {
- 46 STACK_TYPE value;
- 47 Stack_Node *first_node;
- 48
- 49 if(stack_min == stack)
- 50 stack_min = stack->next_min;
- 51
- 52 first_node = stack;
- 53 stack = first_node->next;
- 54 value = first_node->value;
- 55
- 56 free(first_node);
- 57 return value;
- 58 }
- 59
- 60 int top()
- 61 {
- 62 return stack->value;
- 63 }
- 64
- 65
- 66 int min()
- 67 {
- 68 return stack_min->value;
- 69 }
- 70
- 71 int main()
- 72 {
- 73 create_stack();
- 74 push(5);
- 75 printf("min:%d\n",min());
- 76 push(4);
- 77 printf("min:%d\n",min());
- 78 push(3);
- 79 printf("min:%d\n",min());
- 80 push(5);
- 81 printf("min:%d\n",min());
- 82 push(1);
- 83 printf("min:%d\n",min());
- 84 push(90);
- 85
- 86 printf("min:%d\n",min());
- 87 printf("pop:%d\n",pop());
- 88 printf("min:%d\n",min());
- 89 printf("pop:%d\n",pop());
- 90 printf("min:%d\n",min());
- 91 printf("pop:%d\n",pop());
- 92 printf("min:%d\n",min());
- 93 printf("pop:%d\n",pop());
- 94 printf("min:%d\n",min());
- 95 printf("pop:%d\n",pop());
- 96 printf("min:%d\n",min());
- 97 printf("pop:%d\n",pop());
- 98
- 99 return 0;
- 100 }