mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
996 字
3 分钟
利用栈实现反转
2026-04-06

栈实现反转#

在本文,我们将通过栈来实现字符串和链表的反转。

一、实现字符串反转#

a

c语言的字符串以NULL结尾,也就是\0

我们先来插入到栈里面,通过索引的方式,将字母一一入栈。索引走到最后并将字母入栈完成后,还得回到原点!

b

所有元素入栈完成之后,索引重置后如下

c

接着我们利用Top获取到栈顶的元素,将其写入到字符串里,进行替换!

d

我们继续上面的操作,就能实现字符串反转!

原理就是利用栈后进先出的特性,让其作为容器存储字母。

cpp实现#

我们可以利用面向对象来创建一个栈类

class stack{
private:
char A[101];
int top;
public:
void Push(int x);
void Pop();
int Top();
bool IsEmpty();
}

但是实际上并不需要这么做🤣

cpp标准库内置了栈的实现,只需#include<stack>即可

完整cpp代码,这里兼容了c语言,可能不是最佳实现方式,可以使用cpp的标准库<string>或者手动实现字符串

#include<iostream>
#include<stack>
#include <cstring>
using namespace std;
void Reverse(char *C,int n){
stack<char> S;
//loop for push
for(int i=0;i<n;i++){
S.push(C[i]);
}
//loop for pop
for(int i=0;i<n;i++){
C[i]=S.top();//从栈里写入到字符串
S.pop();//利用pop函数清除栈顶元素
}
}
int main(){
char C[51];
cout<<"Enter a string";
cin>>C;
Reverse(C,strlen(C));
cout<<"OUTOUT= "<<C;
}

这样操作的时间复杂度是O(n),对于stack来说使用的内存和字符串的字符数成正比,所以空间复杂度也为O(n)

如果你不想要使用栈来实现反转,那么我们可以通过双指针的方式,一个定义为i,另一个为j

只要满足i<j,那么就走一次循环,实现A[i]=A[j],来调换位置。这样的空间复杂度为O(1),时间复杂度为O(n)。

二、实现链表的反转#

由于链表只有头节点的内存地址是已知的,并且我们每次操作都得按照头节点来。所以我们不可能像字符串那样定义两个指针,因为末尾节点的地址是未知的!🤔

我们在之前利用迭代(时间复杂度为O(n),空间复杂度为O(1))和递归(时间复杂度为O(n),空间复杂度为O(n))实现了链表的反转,其中会用到一些临时变量,以及递归时会隐式的使用到栈(函数调用就是一种栈)。

f

我们通过遍历链表来将地址一一压入栈中

为什么不压数据???🤔

要是压入数据的话,压入的数据只是个数字,跟左边的链表就没半毛钱关系了,下次不要问这么纯度的问题!💢

(ps:其实我也问过🤣)

如何用cpp实现?下面简写,因为我要睡觉了😎

#include<stack>
#include<iostream>
struct Node {
int data; // 数据域(可以是任意类型)
Node* next; // 指针域,指向下一个节点
stack<struct Node*> S;

实现从链表中读数并压栈

Node *temp=head;
while(temp!=NULL){
S.push(temp);
temp=temp->next;
}

这样就能得到上一站图

接着我们覆盖与销毁

Node *temp=S.top();
head=temp;
S.pop();

这样操作之后,head就被我指向了末尾,并清除了栈顶的地址。

q

接着我们利用循环来改变链表里的节点

Node *temp=S.top();
head=temp;
S.pop();
while(!S.empty()){
temp->next=S.top();
S.pop();
temp=temp->next;
}
temp->next=NULL;//栈空了后对应的节点让其地址连接到NULL

判断条件是看栈有没有被出空,然后修改链表的连接使其反向,删除栈内已经操作的元素,移动指针继续操作下一个元素。

完整函数

void Reverse(){
if(head==NULL)return;
Node *temp=head;
while(temp!=NULL){
S.push(temp);
temp=temp->next;
}
Node *temp=S.top();
head=temp;
S.pop();
while(!S.empty()){
temp->next=S.top();
S.pop();
temp=temp->next;
}
temp->next=NULL;//栈空了后对应的节点让其地址连接到NULL
}

三、总结#

利用栈的特性实现反转,这就是数据结构的魅力所在!

好累好累好累好累

好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累好累

w

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

利用栈实现反转
https://fatdog.20060113.xyz/posts/reverse-stack/
作者
神秘大胖狗
发布于
2026-04-06
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00