c语言用堆栈翻转字符串 例子reverse string gnirts esrever

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct stack{
    char data;
    struct stack *next;
}stack_t;
    
stack_t *create_stack()
{
    stack_t *h = (stack_t *)malloc(sizeof(stack_t));
    h->next = NULL;
    return h;
}

void push_stack(char data, stack_t **p)
{
    stack_t *n = (stack_t *)malloc(sizeof(stack_t));
    n->data = data;
    n->next = (*p)->next;
    (*p)->next = n;
}

char pop_stack(stack_t *p)
{
    return p->data;
}

int main()
{    
    char data;
    int cnt = 0;
    stack_t *head = create_stack();

    while(scanf("%c",&data)){
        if(data == '\n') break;
        push_stack(data, &head);
        cnt ++;
    }
    while(head->next){
        char x = pop_stack(head->next);
        printf("%c",x);
        head = head->next;
    }
    printf("\n");
    
    return 0;
}
 

你所说的问题是什么,我这边调试并没有发现问题!

老实说你这个并不是堆栈算法。这个只是单向链表

你要的每一步过程解释都写在代码上了,有不懂的可以参考此篇博客,这里会有对单向链表详细介绍:

https://blog.csdn.net/cpp_learner/article/details/105015219

如果看了代码注释和博客还是理解不了,再回复我哪里不懂,给你讲解一下!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 单项链表结构体
typedef struct stack {
	char data;				// 存储数据
	struct stack *next;		// 存储下一个节点
}stack_t;

// 分配头节点内存返回
stack_t *create_stack() {
	stack_t *h = (stack_t *)malloc(sizeof(stack_t));	// 分配内存
	h->next = NULL;		// 节点的下一个节点赋值NULL
	return h;			
}

// 头插法
void push_stack(char data, stack_t **p) {
	stack_t *n = (stack_t *)malloc(sizeof(stack_t));	// 新建节点
	n->data = data;				// 新节点数据赋值
	n->next = (*p)->next;		// 新节点的下一个节点指向头节点的下一个节点
	(*p)->next = n;				// 头节点的下一个节点指向新节点

	/* 由上面几行代码实现头插法,每个新建的节点都在头部进行插入 */
}

// 获取节点数据返回
char pop_stack(stack_t *p) {
	return p->data;
}

int main() {
	char data;
	int cnt = 0;
	stack_t *head = create_stack();		// 为链表分配内存

	while (scanf_s("%c", &data)) {		// 循环输入字符串,直到遇到回车符停止
		if (data == '\n') break;		// 如果是回车符,结束循环
		push_stack(data, &head);		// 头插法,将输入插入链表中
		cnt++;							// 统计字符串的个数
	}
	while (head->next) {				// 当头节点的下一个节点不等NULL时,执行循环体
		char x = pop_stack(head->next);	// 将节点传入函数中,返回参数节点的数据data
		printf("%c", x);				// 输出返回来的data数据
		head = head->next;				// 头节点指向自己的下一个节点
	}
	printf("\n");

	return 0;
}

 

老实说你这个并不是堆栈算法。这个只是单向链表

你要的每一步过程解释都写在代码上了,有不懂的可以参考此篇博客,这里会有对单向链表详细介绍:

https://blog.csdn.net/cpp_learner/article/details/105015219

如果看了代码注释和博客还是理解不了,再回复我哪里不懂,给你讲解一下!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 单项链表结构体
typedef struct stack {
	char data;				// 存储数据
	struct stack *next;		// 存储下一个节点
}stack_t;

// 分配头节点内存返回
stack_t *create_stack() {
	stack_t *h = (stack_t *)malloc(sizeof(stack_t));	// 分配内存
	h->next = NULL;		// 节点的下一个节点赋值NULL
	return h;			
}

// 头插法
void push_stack(char data, stack_t **p) {
	stack_t *n = (stack_t *)malloc(sizeof(stack_t));	// 新建节点
	n->data = data;				// 新节点数据赋值
	n->next = (*p)->next;		// 新节点的下一个节点指向头节点的下一个节点
	(*p)->next = n;				// 头节点的下一个节点指向新节点

	/* 由上面几行代码实现头插法,每个新建的节点都在头部进行插入 */
}

// 获取节点数据返回
char pop_stack(stack_t *p) {
	return p->data;
}

int main() {
	char data;
	int cnt = 0;
	stack_t *head = create_stack();		// 为链表分配内存

	while (scanf_s("%c", &data)) {		// 循环输入字符串,直到遇到回车符停止
		if (data == '\n') break;		// 如果是回车符,结束循环
		push_stack(data, &head);		// 头插法,将输入插入链表中
		cnt++;							// 统计字符串的个数
	}
	while (head->next) {				// 当头节点的下一个节点不等NULL时,执行循环体
		char x = pop_stack(head->next);	// 将节点传入函数中,返回参数节点的数据data
		printf("%c", x);				// 输出返回来的data数据
		head = head->next;				// 头节点指向自己的下一个节点
	}
	printf("\n");

	return 0;
}

 

大哥们,这个哪里出了问题

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y