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'

 

目录
相关文章
|
5天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
64 9
|
1月前
|
存储 自然语言处理 编译器
【C语言】编译与链接:深入理解程序构建过程
【C语言】编译与链接:深入理解程序构建过程
|
3月前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
99 1
|
3月前
|
NoSQL 编译器 程序员
【C语言】揭秘GCC:从平凡到卓越的编译艺术,一场代码与效率的激情碰撞,探索那些不为人知的秘密武器,让你的程序瞬间提速百倍!
【8月更文挑战第20天】GCC,GNU Compiler Collection,是GNU项目中的开源编译器集合,支持C、C++等多种语言。作为C语言程序员的重要工具,GCC具备跨平台性、高度可配置性及丰富的优化选项等特点。通过简单示例,如编译“Hello, GCC!”程序 (`gcc -o hello hello.c`),展示了GCC的基础用法及不同优化级别(`-O0`, `-O1`, `-O3`)对性能的影响。GCC还支持生成调试信息(`-g`),便于使用GDB等工具进行调试。尽管有如Microsoft Visual C++、Clang等竞品,GCC仍因其灵活性和强大的功能被广泛采用。
118 1
|
3月前
|
编译器 C语言 计算机视觉
C语言实现的图像处理程序
C语言实现的图像处理程序
140 0
|
29天前
|
C语言
数组栈的实现(C语言描述)
本文介绍了如何在C语言中使用数组来实现栈的数据结构,包括栈的创建、入栈、出栈、获取栈顶元素、检查栈是否为空、获取栈的大小以及销毁栈等操作,并提供了相应的函数实现。
22 1
|
27天前
|
存储 文件存储 C语言
深入C语言:文件操作实现局外影响程序
深入C语言:文件操作实现局外影响程序
|
2月前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
345 8
|
2月前
|
存储 编译器 程序员
C语言程序的基本结构
C语言程序的基本结构包括:1)预处理指令,如 `#include` 和 `#define`;2)主函数 `main()`,程序从这里开始执行;3)函数声明与定义,执行特定任务的代码块;4)变量声明与初始化,用于存储数据;5)语句和表达式,构成程序基本执行单位;6)注释,解释代码功能。示例代码展示了这些组成部分的应用。
88 10
|
2月前
|
存储 C语言
数据结构基础详解(C语言): 栈与队列的详解附完整代码
栈是一种仅允许在一端进行插入和删除操作的线性表,常用于解决括号匹配、函数调用等问题。栈分为顺序栈和链栈,顺序栈使用数组存储,链栈基于单链表实现。栈的主要操作包括初始化、销毁、入栈、出栈等。栈的应用广泛,如表达式求值、递归等场景。栈的顺序存储结构由数组和栈顶指针构成,链栈则基于单链表的头插法实现。
329 3