我们先说下栈的知识,先看下我们之前写的文章
栈,C语言实现
如何自己实现一个栈
堆和栈的区别(转过无数次的文章)
这是一个栈
这是我们把数据入栈的操作
这是数据出栈的操作
之前僚机号里面发了一个用C++实现的栈文章,比较简单,基于上一次的代码再升华一下,我认为在熟悉快速写出一个栈代码,对大家在面试笔试中帮助是非常大的。
下面写了两段代码实现栈,代码不一定是完美的,肯定存在问题,但是基本思路我觉得还是可以的,有两种方法来实现,第一种是用数组来实现栈,还有一种是用指针实现。
如果在面试,面试官说让你用代码实现一个栈,因为面试的时间比较紧,而且大多数人在面试的时候可能会比较紧张,我建议用数组实现,用数组实现一个栈会简单很多,说白了有手就行,当然了,你要是可以用指针实现,而且写得比较全面,这个是加分的地方。
用数组实现的时候,我们一个元素就是一个数组的值,数组的下标可以把整个栈串联起来。
#用数组实现栈
#include <iostream>
using namespace std;class IntStack{enum {ssize = 100};int stack[ssize];int top;public:/*构造函数,初始化top变量的值*/IntStack():top(0){}/*插入数据*/void push(int i){stack[top++] = i;}/*遍历*/void TraverseStack(){cout << "---" << endl;for(int i = 0;i<top; ++i){ if(i != top -1)cout <<stack[i] << "->";elsecout <<stack[i] << endl; } } /*弹出数据*/int pop(){return stack[--top];}
};int main()
{IntStack is;for(int i = 0; i< 20; i++){is.push(i*i);}is.TraverseStack();is.pop();is.TraverseStack();is.pop();is.TraverseStack();is.push(77);is.push(77);is.push(77);is.TraverseStack();
}
程序输出
---
0->1->4->9->16->25->36->49->64->81->100->121->144->169->196->225->256->289->324->361
---
0->1->4->9->16->25->36->49->64->81->100->121->144->169->196->225->256->289->324
---
0->1->4->9->16->25->36->49->64->81->100->121->144->169->196->225->256->289
---
0->1->4->9->16->25->36->49->64->81->100->121->144->169->196->225->256->289->77->77->77--------------------------------
Process exited after 0.03563 seconds with return value 0
请按任意键继续. . .
上图是用数组来实现的,用数组实现的栈有一个缺陷,就是栈的大小在定义数组的时候已经确定了,不能做到动态增长。
链表有点不一样,每个节点都需要有一个地址,用来保存下一个节点的地址,我们还需要一个head节点,来保存整个栈的头,这样不至于让我们的栈失去方向。
#用链表来实现一个栈
#include <iostream>
using namespace std;class Node{public:int data;Node *next;
};class Stack{/*指向栈顶的指针*/Node *top;/*栈长度*/int size; public:/*构造函数,初始化top变量的值*/Stack(){top = new Node;top->next = NULL;/*栈长度设置为0*/size = 0;cout << "Stack()"<<endl;}~Stack(){cout << "~Stack()"<<endl;Node *pTemp = top;while(top != NULL){pTemp = top;top = top->next;delete pTemp;}size = 0;}/*插入数据*/void push(int i){if(top == NULL){cout << "stack is null" << endl;return;}/*搞一个temp节点出来*/Node *temp = new Node;temp->data = i;temp->next = NULL;/*把temp节点连接到栈里面去*/if(size == 0){top = temp; } else{temp->next = top;top = temp;}size++;}/*遍历*/void TraverseStack(){if(top->next == NULL){cout << "stack is null" << endl;return;}cout << "---" << endl;Node *pTemp = top;while(pTemp != NULL){if(pTemp->next!=NULL)cout << pTemp->data <<"->";elsecout << pTemp->data <<endl;pTemp = pTemp->next;}} /*弹出数据*/int pop(){if(size == 0){cout << "stack is empty" << endl;return (0);}if(top == NULL){cout << "stack is empty" << endl;return (0);}Node *temp = top;top=top->next;cout <<"pop->data:"<< temp->data <<endl;delete temp;size--;return (0);}/*获取栈长度*/int getLength(){return size;}
};int main()
{Stack *pStack = new Stack();pStack->push(12);pStack->push(13);pStack->push(14);pStack->push(15);pStack->TraverseStack();pStack->pop();pStack->TraverseStack();pStack->pop();pStack->TraverseStack();delete pStack;
}
程序输出
Stack()
---
15->14->13->12
pop->data:15
---
14->13->12
pop->data:14
---
13->12
~Stack()--------------------------------
Process exited after 0.03555 seconds with return value 0
请按任意键继续. . .
推荐阅读:
专辑|Linux文章汇总
专辑|程序人生
专辑|C语言
嵌入式Linux
微信扫描二维码,关注我的公众号