C语言栈的行编辑程序讲解

简介: C语言栈的行编辑程序讲解

C语言栈的行编辑程序是一个模拟文本编辑器行编辑功能的程序,它使用栈数据结构来保存用户的编辑历史,从而支持撤销(undo)和重做(redo)操作。下面是一个简单的C语言栈行编辑程序的讲解和示例代码。

栈的定义

首先,我们需要定义一个栈的数据结构。栈是一种后进先出(LIFO)的数据结构,我们可以使用数组和指针来实现它。

 

#include <stdio.h> 

 

#include <stdlib.h> 

 

#include <string.h> 

 

#include <stdbool.h> 

 

 

 

#define MAX_STACK_SIZE 100

 

#define MAX_LINE_LENGTH 100

 

 

 

typedef struct {

 

char data[MAX_STACK_SIZE][MAX_LINE_LENGTH];

 

int top;

 

} Stack;

 

 

 

void initStack(Stack *s) {

 

s->top = -1;

 

}

 

 

 

bool isEmpty(Stack *s) {

 

return s->top == -1;

 

}

 

 

 

bool push(Stack *s, const char *str) {

 

if (s->top >= MAX_STACK_SIZE - 1) {

 

return false;

 

}

 

strcpy(s->data[++s->top], str);

 

return true;

 

}

 

 

 

bool pop(Stack *s, char *str) {

 

if (isEmpty(s)) {

 

return false;

 

}

 

strcpy(str, s->data[s->top--]);

 

return true;

 

}

 

 

 

void printStack(Stack *s) {

 

for (int i = s->top; i >= 0; i--) {

 

printf("%s\n", s->data[i]);

 

}

 

}

行编辑功能

接下来,我们实现行编辑功能,包括输入字符、撤销和重做。

 

void appendChar(Stack *undoStack, char *currentLine) {

 

char ch;

 

printf("Enter a character to append: ");

 

scanf(" %c", &ch); // 注意空格以跳过任何剩余的换行符

 

currentLine[strlen(currentLine)] = ch;

 

push(undoStack, currentLine);

 

// 清空 redoStack,因为当前操作会覆盖任何可能的重做操作

 

while (!isEmpty(redoStack)) {

 

char dummy[MAX_LINE_LENGTH];

 

pop(&redoStack, dummy);

 

}

 

}

 

 

 

void undoOperation(Stack *undoStack, Stack *redoStack, char *currentLine) {

 

if (isEmpty(undoStack)) {

 

printf("No more undo operations.\n");

 

return;

 

}

 

char prevLine[MAX_LINE_LENGTH];

 

pop(undoStack, prevLine);

 

strcpy(currentLine, prevLine);

 

push(redoStack, prevLine);

 

}

 

 

 

void redoOperation(Stack *undoStack, Stack *redoStack, char *currentLine) {

 

if (isEmpty(redoStack)) {

 

printf("No more redo operations.\n");

 

return;

 

}

 

char nextLine[MAX_LINE_LENGTH];

 

pop(redoStack, nextLine);

 

strcpy(currentLine, nextLine);

 

push(undoStack, nextLine);

 

}

主程序

最后,我们编写主程序来整合这些功能。

 

int main() {

 

Stack undoStack, redoStack;

 

initStack(&undoStack);

 

initStack(&redoStack);

 

char currentLine[MAX_LINE_LENGTH] = "";

 

char input;

 

 

 

while (true) {

 

printf("Current line: %s\n", currentLine);

 

printf("Enter 'a' to append a character, 'u' to undo, 'r' to redo, or 'q' to quit: ");

 

scanf(" %c", &input); // 注意空格以跳过任何剩余的换行符

 

 

 

switch (input) {

 

case 'a':

 

appendChar(&undoStack, currentLine);

 

break;

 

case 'u':

 

undoOperation(&undoStack, &redoStack, currentLine);

 

break;

 

case 'r':

 

redoOperation(&undoStack, &redoStack, currentLine);

 

break;

 

case 'q':

 

printf("Exiting the line editor.\n");

 

return 0;

 

default:

 

printf("Invalid input. Please try again.\n");

 

}

 

}

 

 

 

return 0;

 

}

 

2.

C语言栈的行编辑程序通常用于模拟一个基本的文本编辑器,允许用户输入字符、撤销和重做操作。下面是一个简单的C语言栈行编辑程序的讲解和示例代码。

栈的定义与操作

首先,我们需要定义栈的数据结构以及相关的操作函数,如初始化栈、判断栈是否为空、入栈和出栈。

 

#include <stdio.h> 

 

#include <stdlib.h> 

 

#include <string.h> 

 

#include <stdbool.h> 

 

 

 

#define MAX_STACK_SIZE 100

 

#define MAX_LINE_LENGTH 100

 

 

 

typedef struct {

 

char data[MAX_STACK_SIZE][MAX_LINE_LENGTH];

 

int top;

 

} Stack;

 

 

 

void initStack(Stack *s) {

 

s->top = -1;

 

}

 

 

 

bool isEmpty(Stack *s) {

 

return s->top == -1;

 

}

 

 

 

bool push(Stack *s, const char *str) {

 

if (s->top >= MAX_STACK_SIZE - 1) {

 

return false;

 

}

 

strcpy(s->data[++s->top], str);

 

return true;

 

}

 

 

 

bool pop(Stack *s, char *str) {

 

if (isEmpty(s)) {

 

return false;

 

}

 

strcpy(str, s->data[s->top--]);

 

return true;

 

}

行编辑功能

然后,我们实现行编辑功能,包括输入字符、撤销和重做。这里我们使用两个栈:一个用于撤销(undoStack),另一个用于重做(redoStack)。

 

void appendChar(Stack *undoStack, char *currentLine) {

 

char ch;

 

printf("Enter a character to append: ");

 

scanf(" %c", &ch); // 注意空格以跳过任何剩余的换行符

 

currentLine[strlen(currentLine)] = ch;

 

push(undoStack, currentLine);

 

// 清空 redoStack,因为当前操作会覆盖任何可能的重做操作

 

while (!isEmpty(redoStack)) {

 

char dummy[MAX_LINE_LENGTH];

 

pop(&redoStack, dummy);

 

}

 

}

 

 

 

void undoOperation(Stack *undoStack, Stack *redoStack, char *currentLine) {

 

if (isEmpty(undoStack)) {

 

printf("No more undo operations.\n");

 

return;

 

}

 

char prevLine[MAX_LINE_LENGTH];

 

pop(undoStack, prevLine);

 

strcpy(currentLine, prevLine);

 

push(redoStack, currentLine);

 

}

 

 

 

void redoOperation(Stack *undoStack, Stack *redoStack, char *currentLine) {

 

if (isEmpty(redoStack)) {

 

printf("No more redo operations.\n");

 

return;

 

}

 

char nextLine[MAX_LINE_LENGTH];

 

pop(redoStack, nextLine);

 

strcpy(currentLine, nextLine);

 

push(undoStack, nextLine);

 

}

主程序

最后,我们编写主程序来整合这些功能。

 

int main() {

 

Stack undoStack, redoStack;

 

initStack(&undoStack);

 

initStack(&redoStack);

 

char currentLine[MAX_LINE_LENGTH] = "";

 

char input;

 

 

 

while (true) {

 

printf("Current line: %s\n", currentLine);

 

printf("Enter 'a' to append a character, 'u' to undo, 'r' to redo, or 'q' to quit: ");

 

scanf(" %c", &input); // 注意空格以跳过任何剩余的换行符

 

 

 

switch (input) {

 

case 'a':

 

appendChar(&undoStack, currentLine);

 

break;

 

case 'u':

 

undoOperation(&undoStack, &redoStack, currentLine);

 

break;

 

case 'r':

 

redoOperation(&undoStack, &redoStack, currentLine);

 

break;

 

case 'q':

 

printf("Exiting the line editor.\n");

 

return 0;

 

default:

 

printf("Invalid input. Please try again.\n");

 

}

 

}

 

 

 

return 0;

 

}

运行示例

当运行这个程序时,用户可以通过输入字符来编辑当前行,通过输入 'u' 来撤销上一步操作,通过输入 'r' 来重做上一步撤销的操作,或者通过输入 'q'

 

目录
相关文章
|
1月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
174 9
|
2月前
|
存储 自然语言处理 编译器
【C语言】编译与链接:深入理解程序构建过程
【C语言】编译与链接:深入理解程序构建过程
|
21天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
43 5
|
21天前
|
C语言
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性。本文探讨了C语言中的错误类型(如语法错误、运行时错误)、基本处理方法(如返回值、全局变量、自定义异常处理)、常见策略(如检查返回值、设置标志位、记录错误信息)及错误处理函数(如perror、strerror)。强调了不忽略错误、保持处理一致性及避免过度处理的重要性,并通过文件操作和网络编程实例展示了错误处理的应用。
55 4
|
20天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
49 1
|
21天前
|
网络协议 物联网 数据处理
C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势
本文探讨了C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势。文章详细讲解了使用C语言实现网络通信程序的基本步骤,包括TCP和UDP通信程序的实现,并讨论了关键技术、优化方法及未来发展趋势,旨在帮助读者掌握C语言在网络通信中的应用技巧。
34 2
|
21天前
|
程序员 C语言
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
34 1
|
2月前
|
C语言
数组栈的实现(C语言描述)
本文介绍了如何在C语言中使用数组来实现栈的数据结构,包括栈的创建、入栈、出栈、获取栈顶元素、检查栈是否为空、获取栈的大小以及销毁栈等操作,并提供了相应的函数实现。
40 1
|
2月前
|
存储 文件存储 C语言
深入C语言:文件操作实现局外影响程序
深入C语言:文件操作实现局外影响程序
|
3月前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
475 8