栈的实际应用

  • 反转一个字符串
    1.通过栈
    char C[51] = “hello”;
    通过引入C++库\<stack>创建一个堆栈对象

栈的实际应用

通过for循环从C[i]开始压入栈中,再通过for循环将栈中的数据pop到字符串中去,这里需要注意的是,在入栈时候,不要压入\0字符串结束符,因为会导致pop时候第一个就是字符串结束符。所以我们要用strlen而不是sizeof
2.交换
可能学术术语不是这个,但主要是通过交换字符串中的每个字符的位置,通过两个指针指向字符串的首尾,两个指针做自增和自减,如果i==j说明交换完成,这时候return即可。

栈的实际应用

代码:

#include<iostream>
#include<stack>
#include<string>
using namespace std;
void Reverse(char*C,int n);
void NewReverse(char* C, int n);
int main()
{
	char C[51];
	printf("输入字符串");
	gets_s(C, 51);
	//Reverse(C, strlen(C));
	NewReverse(C, strlen(C));
	printf("Output = %s", C);
}
void Reverse(char* C, int n)
{
	stack<char> S;
	for (size_t i = 0; i < n; i++)
	{
		S.push(C[i]);
	}
	for (size_t i = 0; i < n; i++)
	{
		C[i] = S.top();
		S.pop();
	}
}
void NewReverse(char*C,int n)
{
	char temp;
	int i = 0;
	int j = n-1;
	for (size_t i = 0; i < n-1 ; i++)
	{
					
		temp = C[i];
		C[i] = C[j];
		C[j] = temp;
		j--;
		if (i == j)
		{
			return;
		}
	}
}
C++
  • 反转链表
    之前我们在链表节也学到两种反转链表的方式,递归和迭代,这里简单回忆一下,迭代是通过遍历然后用三个指针分别反转链表的链接。递归是隐性的调用栈去反向打印链表,就是通过递归在全部调用完毕之后,逐层返回执行代码的原理。

栈的实际应用

本节笔记是通过栈反转一个链表,首先你要有一个链表,然后通过遍历的方式压入栈(判断节点地址是否为0)这时候temp已经到了最后一个节点,我们先把头节点指向最后一个节点,再pop一个节点,使得最后一个节点的link等于当前栈顶的节点地址,如何让他一直往下反转呢?判断栈中是否为空,不为空则temp = temp->next; pop;一定要注意在跳出循环要把temp的指针域置为NULL。
代码:

#include<iostream>
#include<stack>
#include<string>
#include<stdlib.h>
using namespace std;
struct Node
{
	int data;
	struct Node* link;
};
Node* head = NULL;
void Print();
void Reverse(char*C,int n);
void NewReverse(char* C, int n);
void LinkReverse();
void Insert(int x)
{
	Node*temp = (Node*)malloc(sizeof(Node));
	temp->data = x;
	temp->link = NULL;
	Node* temp1 = head;
	if (head ==NULL)
	{
		head = temp;
		return;
	}
	temp->link = temp1;
	head = temp;
}
int main()
{
	char C[51];
	//printf("输入字符串");
	//gets_s(C, 51);
	//Reverse(C, strlen(C));
	//NewReverse(C, strlen(C));
	//printf("Output = %s", C);
	Insert(6);
	Insert(4);
	Insert(2);
	Print();
	LinkReverse();
	Print();
}
void Reverse(char* C, int n)
{
	stack<char> S;
	for (size_t i = 0; i < n; i++)
	{
		S.push(C[i]);
	}
	for (size_t i = 0; i < n; i++)
	{
		C[i] = S.top();
		S.pop();
	}
}
void NewReverse(char*C,int n)
{
	char temp;
	int i = 0;
	int j = n-1;
	for (size_t i = 0; i < n-1 ; i++)
	{
					
		temp = C[i];
		C[i] = C[j];
		C[j] = temp;
		j--;
		if (i == j)
		{
			return;
		}
	}
}
void Print()
{
	Node* temp = head;
	while (temp!=NULL)
	{
		printf("List = %d", temp->data);
		temp = temp->link;
	}
	printf("\n");
}
void LinkReverse()
{
	stack<Node*> S;
	Node* temp = head;
	while (temp!=NULL)
	{
		S.push(temp);
		temp = temp->link;
	}
	Node* top = S.top();
	temp = top;
	head = temp;
	S.pop();
	while (!S.empty())
	{
		temp->link = S.top();
		S.pop();
		temp = temp->link;
	}
	temp->link = NULL;
}
C++
C语言

栈的实现(链表)

2024-11-14 17:17:00

C语言

栈的实际应用2

2024-11-14 17:20:43

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索

Powered by atecplugins.com