@@ -57,74 +57,39 @@ browserHistory.back(7); // 你原本在浏览 "google.com
57
57
58
58
<!-- 这里可写通用的实现逻辑 -->
59
59
60
+ ** 方法一:栈**
61
+
62
+ 使用两个栈模拟前进与后退操作。
63
+
60
64
<!-- tabs:start -->
61
65
62
66
### ** Python3**
63
67
64
68
<!-- 这里可写当前语言的特殊实现逻辑 -->
65
69
66
- 列表实现。
67
-
68
- ``` python
69
- class BrowserHistory :
70
- def __init__ (self , homepage : str ):
71
- self .urls = []
72
- self .cur = - 1
73
- self .tail = - 1
74
- self .visit(homepage)
75
-
76
- def visit (self , url : str ) -> None :
77
- self .cur += 1
78
- if self .cur < len (self .urls):
79
- self .urls[self .cur] = url
80
- else :
81
- self .urls.append(url)
82
- self .tail = self .cur
83
-
84
- def back (self , steps : int ) -> str :
85
- self .cur = max (0 , self .cur - steps)
86
- return self .urls[self .cur]
87
-
88
- def forward (self , steps : int ) -> str :
89
- self .cur = min (self .tail, self .cur + steps)
90
- return self .urls[self .cur]
91
-
92
-
93
- # Your BrowserHistory object will be instantiated and called as such:
94
- # obj = BrowserHistory(homepage)
95
- # obj.visit(url)
96
- # param_2 = obj.back(steps)
97
- # param_3 = obj.forward(steps)
98
- ```
99
-
100
- 栈实现。
101
-
102
70
``` python
103
71
class BrowserHistory :
104
72
105
73
def __init__ (self , homepage : str ):
106
- self .s1 = []
107
- self .s2 = []
108
- self .cur = homepage
74
+ self .stk1 = []
75
+ self .stk2 = []
76
+ self .visit( homepage)
109
77
110
78
def visit (self , url : str ) -> None :
111
- self .s2.clear()
112
- self .s1.append(self .cur)
113
- self .cur = url
79
+ self .stk1.append(url)
80
+ self .stk2.clear()
114
81
115
82
def back (self , steps : int ) -> str :
116
- while steps > 0 and self .s1:
117
- self .s2.append(self .cur)
118
- self .cur = self .s1.pop()
83
+ while steps and len (self .stk1) > 1 :
84
+ self .stk2.append(self .stk1.pop())
119
85
steps -= 1
120
- return self .cur
86
+ return self .stk1[ - 1 ]
121
87
122
88
def forward (self , steps : int ) -> str :
123
- while steps > 0 and self .s2:
124
- self .s1.append(self .cur)
125
- self .cur = self .s2.pop()
89
+ while steps and self .stk2:
90
+ self .stk1.append(self .stk2.pop())
126
91
steps -= 1
127
- return self .cur
92
+ return self .stk1[ - 1 ]
128
93
129
94
130
95
# Your BrowserHistory object will be instantiated and called as such:
@@ -138,37 +103,32 @@ class BrowserHistory:
138
103
139
104
<!-- 这里可写当前语言的特殊实现逻辑 -->
140
105
141
- 列表实现。
142
-
143
106
``` java
144
107
class BrowserHistory {
145
- private List<String > urls;
146
- private int cur = - 1 ;
147
- private int tail = - 1 ;
108
+ private Deque<String > stk1 = new ArrayDeque<> ();
109
+ private Deque<String > stk2 = new ArrayDeque<> ();
148
110
149
111
public BrowserHistory (String homepage ) {
150
- urls = new ArrayList<> ();
151
112
visit(homepage);
152
113
}
153
-
114
+
154
115
public void visit (String url ) {
155
- ++ cur;
156
- if (cur < urls. size()) {
157
- urls. set(cur, url);
158
- } else {
159
- urls. add(url);
160
- }
161
- tail = cur;
116
+ stk1. push(url);
117
+ stk2. clear();
162
118
}
163
-
119
+
164
120
public String back (int steps ) {
165
- cur = Math . max(0 , cur - steps);
166
- return urls. get(cur);
121
+ for (; steps > 0 && stk1. size() > 1 ; -- steps) {
122
+ stk2. push(stk1. pop());
123
+ }
124
+ return stk1. peek();
167
125
}
168
-
126
+
169
127
public String forward (int steps ) {
170
- cur = Math . min(tail, cur + steps);
171
- return urls. get(cur);
128
+ for (; steps > 0 && ! stk2. isEmpty(); -- steps) {
129
+ stk1. push(stk2. pop());
130
+ }
131
+ return stk1. peek();
172
132
}
173
133
}
174
134
@@ -181,51 +141,90 @@ class BrowserHistory {
181
141
*/
182
142
```
183
143
184
- 栈实现。
144
+ ### ** C++ **
185
145
186
- ``` java
146
+ ``` cpp
187
147
class BrowserHistory {
188
- private Deque< String > s1;
189
- private Deque< String > s2 ;
190
- private String cur ;
148
+ public:
149
+ stack< string > stk1 ;
150
+ stack< string > stk2 ;
191
151
192
- public BrowserHistory (String homepage ) {
193
- s1 = new ArrayDeque<> ();
194
- s2 = new ArrayDeque<> ();
195
- cur = homepage;
152
+ BrowserHistory(string homepage) {
153
+ visit(homepage);
196
154
}
197
-
198
- public void visit (String url ) {
199
- s2. clear();
200
- s1. push(cur);
201
- cur = url;
155
+
156
+ void visit (string url) {
157
+ stk1.push(url);
158
+ stk2 = stack<string >();
202
159
}
203
-
204
- public String back (int steps ) {
205
- while (steps > 0 && ! s1. isEmpty()) {
206
- s2. push(cur);
207
- cur = s1. pop();
208
- -- steps;
160
+
161
+ string back(int steps) {
162
+ for (; steps && stk1.size() > 1; --steps) {
163
+ stk2.push(stk1.top());
164
+ stk1.pop();
209
165
}
210
- return cur ;
166
+ return stk1.top() ;
211
167
}
212
-
213
- public String forward (int steps ) {
214
- while (steps > 0 && ! s2. isEmpty()) {
215
- s1. push(cur);
216
- cur = s2. pop();
217
- -- steps;
168
+
169
+ string forward(int steps) {
170
+ for (; steps && !stk2.empty(); --steps) {
171
+ stk1.push(stk2.top());
172
+ stk2.pop();
218
173
}
219
- return cur ;
174
+ return stk1.top() ;
220
175
}
176
+ };
177
+
178
+ /**
179
+ * Your BrowserHistory object will be instantiated and called as such:
180
+ * BrowserHistory* obj = new BrowserHistory(homepage);
181
+ * obj->visit(url);
182
+ * string param_2 = obj->back(steps);
183
+ * string param_3 = obj->forward(steps);
184
+ * /
185
+ ```
186
+
187
+ ### **Go**
188
+
189
+ ```go
190
+ type BrowserHistory struct {
191
+ stk1 []string
192
+ stk2 []string
193
+ }
194
+
195
+ func Constructor(homepage string) BrowserHistory {
196
+ t := BrowserHistory{[]string{}, []string{}}
197
+ t.Visit(homepage)
198
+ return t
199
+ }
200
+
201
+ func (this *BrowserHistory) Visit(url string) {
202
+ this.stk1 = append(this.stk1, url)
203
+ this.stk2 = []string{}
204
+ }
205
+
206
+ func (this *BrowserHistory) Back(steps int) string {
207
+ for i := 0; i < steps && len(this.stk1) > 1; i++ {
208
+ this.stk2 = append(this.stk2, this.stk1[len(this.stk1)-1])
209
+ this.stk1 = this.stk1[:len(this.stk1)-1]
210
+ }
211
+ return this.stk1[len(this.stk1)-1]
212
+ }
213
+
214
+ func (this *BrowserHistory) Forward(steps int) string {
215
+ for i := 0; i < steps && len(this.stk2) > 0; i++ {
216
+ this.stk1 = append(this.stk1, this.stk2[len(this.stk2)-1])
217
+ this.stk2 = this.stk2[:len(this.stk2)-1]
218
+ }
219
+ return this.stk1[len(this.stk1)-1]
221
220
}
222
221
223
222
/**
224
223
* Your BrowserHistory object will be instantiated and called as such:
225
- * BrowserHistory obj = new BrowserHistory (homepage);
226
- * obj.visit (url);
227
- * String param_2 = obj.back (steps);
228
- * String param_3 = obj.forward (steps);
224
+ * obj := Constructor (homepage);
225
+ * obj.Visit (url);
226
+ * param_2 : = obj.Back (steps);
227
+ * param_3 : = obj.Forward (steps);
229
228
*/
230
229
```
231
230
0 commit comments