C语言代码判断出栈顺序是否有可能

描述:代码判断出栈顺序有没有可能
思路

      1.首先创建两个数组A、B、其中A用于存放输入的数据,B用于存放需要检测的数据 。
      2.设置i,j控制数组A,B中元素位置。
      3.将A数组的数据用while循环压入堆栈,并且与B数组的数据对比,如果数据相同且堆栈未满,
      则弹出堆栈栈顶元素,并且B中j指向下一位置 。
      4.当跳出循环时,如果堆栈为空,说明数据全部与数组B数据匹配,B顺序正确,否则不正确。
time:2019/8/21
author by LLQ

代码如下:

#include<stdio.h>
#include<malloc.h>
#include"stack.h"

bool StackOrder(int A[],int B[],stack *s){
 	if(A==NULL) 
 		return false;
 	int i,j;
 	i=j=0;
 	while(i<5){
 		printf("插入数据\n");//用于检测 
 		push(s,A[i++]);
 		while(!stackempty(s)&&B[j]==gettop(s)){
 			pop(s);
 			j++;
 		}		
 	}
 	if(stackempty(s))
 		return true;
 	return false;

 }
int main(){ 
//	初始化	
	stack s1,s2;
	inistack(&s1);
	inistack(&s2);
	int A[5]={1,2,3,4,5};
	int B[5]={3,2,1,5,4};//正确顺序,错误顺序:3,1,2,4,5 
	bool flag=0;
	//判断函数 
	flag=StackOrder(A,B,&s1);
	if(flag)
		printf("顺序正确!");
	else
		printf("顺序错误!");
}

需要引入的stack.h文件

#include <stdio.h>
#include <malloc.h>
#include <string.h>
//******堆栈数据结构****** 
typedef struct
{
	char *base;
	char *top;
	int size;
}stack;
//******堆初始化 ****** 
void inistack(stack *A) 
{	
	A ->base =(char *)malloc(100*sizeof(char));
	A ->top = A ->base;
	A ->size = 100;	
} 
//******判断栈是否为空******
bool stackempty(stack *A) 
{
	if(A->top==A->base)
		return true;
	else
		return false;
}
bool push(stack *A,char x)
{
	if(A->top-A->base >=A ->size)
		A->base = (char *)realloc(A ->base, (A->size+10)*sizeof(char));
	*A->top++=x;
	    return true;
} 
char pop(stack *A)
{
	if(A->top==A->base )
		return 0;
	
	return(*--A->top);
}
char gettop(stack *A)
{
	if(A->top==A->base)
		return 0;
	return *(A->top-1);
}

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C语言中可以使用顺序表来实现数组,也可以使用链表来实现动态分配内存的数据结构。如果想要实现哈希表,可以使用结构体数组和链表结合的方式来实现。 对于顺序表实现数组,可以通过定义一个固定长度的数组来存储数据,并且可以通过下标索引来访问数组中的元素。例如: ``` #define MAXSIZE 100 int array[MAXSIZE]; ``` 对于链表实现动态分配内存的数据结构,可以使用结构体来定义每一个节点,并且节点中包含一个指向下一个节点的指针。例如: ``` struct Node { int data; struct Node *next; }; ``` 对于哈希表的实现,可以使用结构体数组来表示哈希表中的每一个元素,每个元素可以包含一个链表,用来存储具有相同哈希值的元素。例如: ``` #define HASHSIZE 100 struct Node { int data; struct Node *next; }; struct HashTable { struct Node *list; }; struct HashTable hashtable[HASHSIZE]; ``` 在使用哈希表时,可以通过计算每个元素的哈希值,将元素存储到对应的链表中。当需要查找元素时,只需要计算出元素的哈希值,然后在对应的链表中查找即可。 ### 回答2: C语言中可以使用顺序栈来实现括号匹配。 首先,我们需要定义一个结构体来表示顺序栈,包括栈的最大容量和当前的栈顶指针。可以使用一个一维数组来实现栈的存储。 然后,我们需要实现两个基本的操作:入栈和出栈。入栈操作将一个元素添加到栈的顶部,出栈操作将栈顶的元素移除。 在进行括号匹配时,我们可以遍历输入的字符串中的每个字符。当遇到左括号时,我们将其入栈;当遇到右括号时,我们将其与栈顶元素进行匹配。如果栈顶元素为对应的左括号,则将栈顶元素出栈;否则,表示括号不匹配。 当遍历完所有字符后,如果栈为空,说明所有的括号都匹配成功。如果栈不为空,说明还有未匹配的括号。 以下是一个用C语言实现括号匹配的示例代码: ```c #include <stdio.h> #define MAX_SIZE 100 // 定义顺序栈结构体 typedef struct { char data[MAX_SIZE]; int top; } Stack; // 初始化栈 void init(Stack *stack) { stack->top = -1; } // 判断是否为空 int isEmpty(Stack *stack) { return stack->top == -1; } // 入栈 void push(Stack *stack, char c) { if (stack->top == MAX_SIZE - 1) { printf("Stack is full\n"); return; } stack->data[++(stack->top)] = c; } // 出栈 char pop(Stack *stack) { if (isEmpty(stack)) { printf("Stack is empty\n"); return '\0'; } return stack->data[(stack->top)--]; } // 括号匹配 int matchBrackets(char *str) { Stack stack; init(&stack); int i = 0; while (str[i] != '\0') { if (str[i] == '(' || str[i] == '[' || str[i] == '{') { push(&stack, str[i]); } else if (str[i] == ')' || str[i] == ']' || str[i] == '}') { if (isEmpty(&stack)) { return 0; } char topChar = pop(&stack); if ((str[i] == ')' && topChar != '(') || (str[i] == ']' && topChar != '[') || (str[i] == '}' && topChar != '{')) { return 0; } } i++; } return isEmpty(&stack); } int main() { char *str = "[()]{}{[()()]()}"; if (matchBrackets(str)) { printf("括号匹配成功\n"); } else { printf("括号匹配失败\n"); } return 0; } ``` 以上示例中,我们使用了一个字符数组来表示输入的字符串,并定义了一个`Stack`结构体来实现顺序栈。在`matchBrackets`函数中,我们遍历输入字符串的每个字符,并根据字符的类型进行相应的操作。最后,根据栈是否为空来判断括号是否匹配成功,并输出结果。 注意,在实际应用中,我们可能还需要处理其他的情况,如字符不是括号或者存在其他字符等。这里的示例只是简单地实现了括号匹配的基本逻辑。 ### 回答3: C语言可以用顺序栈实现括号匹配。首先,我们需要定义一个存储括号的顺序栈结构,其中包含一个数组用来存放括号元素,以及一个指针top来指示栈顶位置。 当开始遍历表达式时,我们遇到左括号时,将其入栈,当遇到右括号时,我们将比较栈顶元素与当前括号是否匹配。如果匹配,则弹出栈顶元素,继续遍历;如果不匹配,表明括号不匹配,直接返回不匹配的结果。 在遍历完成后,如果栈为空,则说明所有括号都匹配成功,如果栈不为空,则说明有括号没有匹配成功,返回括号不匹配的结果。 以下是用C语言实现括号匹配的代码: ```c #include <stdio.h> #include <stdbool.h> #define MAX_SIZE 50 typedef struct { char data[MAX_SIZE]; int top; } Stack; void init(Stack *stack) { stack->top = -1; } bool isEmpty(Stack *stack) { return stack->top == -1; } void push(Stack *stack, char c) { if(stack->top == MAX_SIZE - 1) { printf("Stack overflow!\n"); return; } stack->data[++(stack->top)] = c; } char pop(Stack *stack) { if(isEmpty(stack)) { printf("Stack underflow!\n"); return '\0'; } return stack->data[(stack->top)--]; } bool isMatching(char left, char right) { if(left == '(' && right == ')') return true; else if(left == '[' && right == ']') return true; else if(left == '{' && right == '}') return true; else return false; } bool isBalanced(char expression[]) { Stack stack; init(&stack); for(int i = 0; expression[i] != '\0'; i++) { if(expression[i] == '(' || expression[i] == '[' || expression[i] == '{') { push(&stack, expression[i]); } else if(expression[i] == ')' || expression[i] == ']' || expression[i] == '}') { if(isEmpty(&stack) || !isMatching(pop(&stack), expression[i])) { return false; } } } return isEmpty(&stack); } int main() { char expression[MAX_SIZE]; printf("请输入一个表达式:"); scanf("%s", expression); if(isBalanced(expression)) { printf("括号匹配成功!\n"); } else { printf("括号匹配失败!\n"); } return 0; } ``` 在这个实现中,我们用init()函数初始化了栈,用isEmpty()函数判断是否为空,用push()函数将元素入栈,用pop()函数弹出栈顶元素。isMatching()函数用来判断两个括号是否匹配。isBalanced()函数用来检查整个表达式的括号是否匹配。在主函数中,我们首先输入一个表达式,然后调用isBalanced()函数判断括号是否匹配,并输出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值