栈的特性就是先进后出只能在一端操作,好多应用场合 比如浏览器的后退呀、敲代码时编辑器Ctrl+z 返回上一步呀 等等 ,队列的话是先进先出 两边操作,首先C我们用数组来实现一个栈和队列 然后C++在用链表实现栈和队列
定义一些宏变量 以便修改方便
#define ElemType int //栈元素这里使用int类型 #define MAX_SIZE 10 //初始化栈的大小 #define ADD_SIZE 10// 增量大小
定义一个栈的属性 包含一个数组和栈当前的长度
typedef struct _Node{ int len; ElemType array[MAX_SIZE]; }ArrayList;
//初始化一个栈或者一个队列 ArrayList* init(){ ArrayList* list=(ArrayList*)malloc(sizeof(ArrayList)); list->len=0; return list; }
//入栈 入队列 int push(ArrayList* list,ElemType data){ //动态增加栈空间 if (list->len>=MAX_SIZE) { list=realloc(list,ADD_SIZE); } list->array[list->len]=data; list->len++; return 0; }
//弹栈 ElemType pop(ArrayList* list){ int data=list->array[list->len-1]; list->len--; return data; }
出队列方法
//出队列 ElemType queuepop(ArrayList* list){ int data=list->array[0]; list->len--; return data; }
//销毁栈 int destory(ArrayList* list){ if (list!=NULL) { free(list); } return 0; }
#include <stdio.h> #include<stdlib.h> #define ElemType int //栈元素这里使用int类型 #define MAX_SIZE 10 //初始化栈的大小 #define ADD_SIZE 10// 增量大小 typedef struct _Node{ int len; ElemType array[MAX_SIZE]; }ArrayList; //初始化一个栈或者队列 ArrayList* init(){ ArrayList* list=(ArrayList*)malloc(sizeof(ArrayList)); list->len=0; return list; } //入栈或者入队列 int push(ArrayList* list,ElemType data){ //动态增加栈或者队列空间 if (list->len>=MAX_SIZE) { list=realloc(list,ADD_SIZE); } list->array[list->len]=data; list->len++; return 0; } //弹栈 ElemType pop(ArrayList* list){ int data=list->array[list->len-1]; list->len--; return data; }
int getLen(ArrayList* list){ return list->len;} ElemType getNoded(ArrayList* list,int index){ ElemType da=list->array[index]; return da; } //销毁栈 int destory(ArrayList* list){ if (list!=NULL) { free(list); } return 0; } int cleal(ArrayList* list){ list->len=0; return 0; } int main(){ int i1=1; int i2=2; int i3=3; int i4=4; int i5=5; int i=0; ArrayList* list=init(); push(list, i1); push(list, i2); push(list, i3); push(list, i4); push(list, i5); for(i=0;i<getLen(list);i++){ int data= getNoded(list, i); printf("%d\n",data); } pop(list); printf("-----------\n"); for(i=0;i<getLen(list);i++){ int data= getNoded(list, i); printf("%d\n",data); } pop(list); printf("-----------\n"); for(i=0;i<getLen(list);i++){ int data= getNoded(list, i); printf("%d\n",data); } destory(list); return 0; }
#ifndef _______Stack2__ #define _______Stack2__ #include <stdio.h> #include <stdlib.h> template <typename T> struct Node{ T data; Node *next; }; template <typename T> class Stack{ public: Node<T> *heard; int len; public: Stack<T>(); ~Stack<T>(); bool add(T t,int index); T get(int index); T remove(int index); T pop(); T quepop(); bool push(T t); }; #endif /* defined(_______Stack2__) */
#include "Stack2.h" template <typename T> Stack<T>::Stack(){ heard=nullptr; len=0; } template <typename T> Stack<T>::~Stack<T>(){ } //链表---在指定位置添加元素 template <typename T> bool Stack<T>::add(T t,int index){ Node<T> *p=heard; Node<T> *node=new Node<T>(); node->data=t; node->next=nullptr; if (index==0) { node->next=heard; heard=node; }else { int i=1; while(p->next!=nullptr&&i<index){ p=p->next; i++; } node->next= p->next; p->next=node; } len++; return true; } //链表--删除指定位置的元素 template <typename T> T Stack<T>::remove(int index){ Node<T> *p=heard; Node<T> *tmp; if (index==0) { tmp=heard; heard=tmp->next; }else{ int i=1; while(p->next!=nullptr&&i<index){ p=p->next; i++; } tmp=p->next; p->next= tmp->next; } len--; return tmp->data; } //队列---出队列 template <typename T> T Stack<T>::quepop(){ Node<T> *p=heard; int i=0; while (p->next!=nullptr&&i<len) { p=p->next; i++; } len--; return p->data; } //栈---出栈 template <typename T> T Stack<T>::pop(){ Node<T> *p=heard; heard=p->next; len--; return p->data; } //栈----进栈 或者 队列--进队列 template <typename T> bool Stack<T>::push(T t){ Node<T> *node=new Node<T>(); node->data=t; node->next=heard; heard=node; len++; return true; } //链表---获取指定位置的元素 template <typename T> T Stack<T>::get(int index){ Node<T> *p=heard; int i=0; while (p->next!=nullptr&&i<index) { p=p->next; i++; } return p->data; }