Comments (3)
java语言版本:
class Stack{
LinkedList list;//声明集合
/**
* 无参构造方法
*/
public Stack(){
list=new LinkedList();//创建集合
}
/**
* 添加方法
* @param o
*/
public void add(Object o){
list.push(o);//将元素添加进集合第一个元素
}
/**
* 获取方法
* @return
*/
public Object get(){
return list.pop();//删除集合的首元素并返回
}
/**
* 获取集合长度
* @return
*/
public int size(){
return list.size();
}
}
from android-discuss.
虽然说的是 “任意语言”,但面试官考察的就是:
- 怎么建数据结构;
push()
和pop()
等操作的实现;
所以,直接用 built-in 的集合类 API 肯定是不行的。
对于栈,主要是理解其 “单向操作”、“先进后出” 的特性。
这里给出 Golang 版本的实现(链式存储),不熟悉 Golang 也没关系(其实跟 C 语言很像),**是一样的,我下面注释也很详细:
package stack
//定义节点数据结构(仅供内部使用):
type node struct {
value interface{} //节点数据(任意类型);
next *node //下一个节点的指针;
}
//定义链栈数据结构(供外部使用):
type LinkedStack struct {
top *node //栈顶指针;
size int //栈大小;
}
//读取栈大小:
func (stack *LinkedStack) Size() int {
return stack.size //直接返回size变量的值;
}
//入栈操作:
func (stack *LinkedStack) Push(value interface{}) {
new_node := &node{value, stack.top} //创建新的栈顶节点,其next指针指向原栈顶指针;用临时指针变量保存其地址;
stack.top = new_node //修改栈顶指针,指向新节点;
new_node = nil //销毁临时指针变量(注意这里不能清空new_node.value和new_node.next,因为通过new_node实际操作的是整个栈顶节点!);
stack.size++ //修改栈大小;
}
//出栈操作(删除栈顶节点):
func (stack *LinkedStack) Pop() {
if stack.size == 0 { //判断栈是否为空;
panic("Stack is empty.")
}
top_node := stack.top //临时保存原来的栈顶结点指针(用于后面的销毁操作);
stack.top = top_node.next //修改栈顶结点为当前栈顶结点的next指针;
top_node.value = nil //销毁原来的栈顶结点(注意这三步的顺序:先清数据,再将next指针置为空,最后将该指针置为空。顺序错了会导致空指针操作异常);
top_node.next = nil
top_node = nil
stack.size-- //修改栈大小;
}
//读取栈顶节点数据(不删除该节点):
func (stack *LinkedStack) Peek() interface{} {
if stack.size == 0 { //判断栈是否为空;
panic("Stack is empty.")
}
return stack.top.value //返回栈顶节点的数据;
}
测试代码:
package stack
import (
"fmt"
"testing"
)
func Test_linked_stack(t *testing.T) {
stack := &LinkedStack{}
stack.Push("iOS")
stack.Push("Android")
stack.Push("WindowsPhone")
stack.Push("Symbian")
stack.Push("BalckBerry")
for stack.Size() > 0 {
fmt.Printf("%s\n", stack.Peek())
stack.Pop()
}
}
注意
- 上面的
Push()
函数我使用new_node
临时指针变量是为了增强代码可读性,其实可以一步到位:
func (stack *LinkedStack) Push(value interface{}) {
stack.top = &node{value, stack.top}
stack.size++
}
Pop()
函数也可以直接返回栈顶节点数据(不需要Peek()
操作)。这个看具体需求了,代码稍作修改即可:
func (stack *LinkedStack) Pop() interface{} {
if stack.size == 0 {
panic("Stack is empty.")
}
top_node := stack.top
stack.top = top_node.next
x := top_node.value //保存原栈顶元素数据(用于返回);
top_node.value = nil
top_node.next = nil
top_node = nil
stack.size--
return x //返回原栈顶元素数据;
}
from android-discuss.
mark
from android-discuss.
Related Issues (20)
- Retrofit GsonConverterFactory 解析带有转义符的数据 HOT 3
- 各位遇到过对自己的内部存储空间没有访问权限的情况吗? HOT 16
- 【求助】gradle中的依赖报错,已经配置了项目仓库但是还是无法解析是什么原因?
- 华为P20 QQ 微信打开文件-其他应用打开,显示不出自己的应用图标是咋回事 HOT 6
- 怎么在VS上打开github考下来的项目?需要哪些软件?
- 【问答】国产手机如何获取锁屏通知、横幅通知权限是否打开?
- 【提问】为什么 codekk 需要 github 用户所有的写入权限
- 【问答】Android 中通过MediaPlayer播放视频如何切换原伴唱 HOT 2
- [问答] 使用蓝牙耳机的麦克风录音的方案有哪些?
- [问答]Android SN就是存储在/vendor/nvdata/APCFG/APRDEB/PRODUCT_INFO的前64位吗?
- []
- [问答] 如何让自己的 app 中禁用第三方软件的 AccessibilityService 对其操作。
- 短视频模替换素材是怎么实现的?
- 怎么限制FlexboxLayout 一行显示的个数再换行
- Android组件化后 本地数据库如何设计 HOT 2
- 怎么限制FlexboxLayout的行数,并且多出的部分在末尾显示.....? HOT 1
- vivo 应用市场的包,无法自动更新 HOT 1
- room 存取操作
- > > @c
- 现在android使用了AOP的框架都有哪些? HOT 9
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from android-discuss.