编写一个算法程序实现在一个顺序栈中把一个字符串逆置的运算,要求使用入栈和出栈运算来完成。

作者&投稿:伏昂 (若有异议请与网页底部的电邮联系)
试设计一个算法,利用栈和队的基本运算,将队列 Q 中的全部元素逆置存放。~

算法思想很简单,就是输入字符串依次入队列b,然后在把队列中元素依次做出对操作并把返回值入栈a,然后再依次出栈并把返回值入队列c。
最后输出逆置操作前,即b中的元素;
输出逆置操作后,即c中的元素;

代码如下:
//---------------------------------------------------------------------------

#include
#include

typedef struct node{
char data;
struct node *next;
}node;

typedef struct {
node *top;
unsigned int size;
} stack;

typedef struct{
node *front;
node *back;
unsigned int size;
} queue;

char pops(stack *a)
{
node *tf=NULL;
char rt=0;
if (a->size) {
tf=a->top;
a->top=a->top->next;
--a->size;
rt=tf->data;
free(tf);
}

return rt;
}

char popq(queue *a)
{
node *tf=NULL;
char rt=0;
if (a->size) {
tf=a->front;
a->front=a->front->next;
--a->size;
rt=tf->data;
free(tf);
}
return rt;
}

void push(stack *a,const char c)
{
node *t=(node*)malloc(sizeof(node));
if (t) {
t->data=c;
t->next=a->top;
a->top=t;
++a->size;
}
}
void push_back(queue *a,const char c)
{
node *t=(node*)malloc(sizeof(node));
if (t) {
t->data=c;
t->next=NULL;
if (!a->size) {
a->front=a->back=t;
}
else
{
a->back->next=t;
a->back=t;
}

++a->size;
}
}

int isempty(void *a,int tp)
{
if (tp==1) return !(((stack *)a)->size);
else return !(((queue *)a)->size);
}
void initqs(void *a,int tp)
{
if (tp==1) {
((stack*)a)->top=NULL;
((stack*)a)->size=0;
}
else{
((queue*)a)->front=((queue*)a)->back=NULL;
((queue*)a)->size=0;
}
}

void del(void *a,int tp)
{
node *t;
if (tp==1) {
while (((stack*)a)->top){
t= ((stack*)a)->top;
((stack*)a)->top=((stack*)a)->top->next;
free(t);
}
free(a);
}
else {
while (((queue*)a)->front){
t= ((queue*)a)->front;
((queue*)a)->front=((queue*)a)->front->next;
free(t);
}
free(a);
}
}
void chk()
{
char ch;
int fg=1,rt=0;

stack *a=(stack*)malloc(sizeof(stack));
queue *b=(queue*)malloc(sizeof(queue));
queue *c=(queue*)malloc(sizeof(queue));
queue *temp = (queue *)malloc(sizeof(queue));
if (!a||!b||!c||!temp) {
fprintf(stderr,"MEMORY ERROR");
exit(-1);
}
initqs(a,1);
initqs(b,0);
initqs(c,0);
initqs(temp,0);

puts("Enter a string ,end with @");
while ((ch=getchar())!='@')
{
push_back(b,ch);
push_back(temp,ch);
}
while (!isempty(temp, 0))
push(a, popq(temp));

while (!isempty(a,1))
push_back(c, pops(a));

printf("执行逆序算法前:");
while (!isempty(b, 0))
{
printf("%c ", popq(b));
}
printf("
执行逆序算法后:");

while (!isempty(c, 0))
printf("%c ", popq(c));
printf("
");

del(a,1);
del(b,0);
del(c,0);
del(temp,0);

}
int main(void)
{
chk();

return 0;
}

C语言版,其他语言类似,思想就这样了
void reverse(int a[],int n)
{
int i;
for(i=0;i<n/2;i++)
{
push(s,a[i]);
a[i]=a[n-i-1];
pop(s,a[n-i-1]);
}
}

void ReverseString(char *a,int lenth) //逆转函数
{
int i;
char c;
initstack(&s);
for(i=0;i<lenth;i++) Push(&s,a[i]);
for(i=0;i<lenth;i++) {Pop(&s,&c);a[i]=c;}
}

---------------------------------------------------------------------
typedef struct //循环队列定义
{
int data[4];
int front;
int rear;
}SeqQueue;

void InitQueue(SeqQueue *Q) //初始化函数
{
Q->front=Q->rear=0;
}
int EnterQueue(SeqQueue *Q,int x) //入队函数
{
if((Q->rear+1)%4==Q->front) return 0;
Q->data[Q->rear]=x;
Q->rear=(Q->rear+1)%4
return 1;
}

写个main函数调用两次入队即可!

用什么语言写呢

typedef char ElemType;

typedef struct {
ElemType *stack;
ElemType * top;
int MaxSize;
} Stack;

typedef struct {
ElemType *queue;
int front, rear;
} Queue;

void HuiWen(char str[ ]){
Queue myQueue;
Stack myStack;
char x, y;
int i, length;
length = strlen(str);
InitQueue (myQueue);
InitStack (myStack);
for ( i=0; i<length; i++ ) {
EnQueue ( myQueue, str[i] );
Push( myStack, str[i] );
}
while ( ! EmptyQueue( myQueue ) && ! EmptyStack( myStack ) )
{
x = DeQueue( myQueue ) ;
y = Pop( myStack );
if ( x!=y )
{
cout<<str<<“不是回文”<<endl;
return;
}
}
cout<<str<<“是回文”<<endl;
}


编一个程序,用递归函数 gcd(a,b)实现求两个整数 a,b 最大公因子的欧几...
其实你可以去百度百科里面查一下这个算法是怎么样的,求2个数的最大公约数的话,我们知道这个道理:如果c是a与b的最大公约数,那么c也是(a%b取余数)与b的最大公约数(这里是如果a>b,如果a rem=2%3=2。gcd(3,2);2!=0 ==>...

编写一个算法程序实现在一个顺序栈中把一个字符串逆置的运算,要求使 ...
rear;}SeqQueue;void InitQueue(SeqQueue *Q) \/\/初始化函数 { Q->front=Q->rear=0;} int EnterQueue(SeqQueue *Q,int x) \/\/入队函数 { if((Q->rear+1)%4==Q->front) return 0;Q->data[Q->rear]=x;Q->rear=(Q->rear+1)%4 return 1;} 写个main函数调用两次入队即可!

1、编写一个算法程序实现在一个顺序栈中把一个字符串逆置的运算,要求使 ...
typedef char ElemType;typedef struct { ElemType *stack;ElemType * top;int MaxSize;} Stack;typedef struct { ElemType *queue;int front, rear;} Queue;void HuiWen(char str[ ]){ Queue myQueue;Stack myStack;char x, y;int i, length;length = strlen(str);InitQ...

设计一个算法,求出满足条件1×3×5×…×n>50000的最小正整数n,并画出...
原因是你的 i 每次都执行了 i++ 操作。举例: 求出满足条件1×3×5×…×n>10的最小正整数n 我们知道答案应该是5。按正解 S = 1; i = 3;if(S<=10){ S = S * i; \/\/ 当i=3时,执行: S = 1*3 =3; i=i+2; 此时i=5;i = i + 2; \/\/ 当i=5时,执行...

写一个递归算法,实现字符串逆序存储,要求不另设串存储空间
include "stdio.h"include "string.h"void main(){ char str[50]="ABCDEFGHsdfwefsdf123",tmp;int i,len;len=strlen(str);printf("old %s\\n",str);for(i=0;i<len\/2;i++){ tmp=str[i];str[i]=str[len-i-1];str[len-i-1]=tmp;} printf("new %s\\n",str);} ...

设计一个按优先数调度算法实现处理器调度的程序。 高手帮忙!!_百度知...
五个进程的初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态为“结束”,用“E”表示。(2) 在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“优先数”和“要求运行时间”。(3) 为了调度方便,把五个进程按给定的优先数从大到小连成队列。用一单元指出队首进程,用指针指出...

做一个RSA的算法,C语言实现的~!编程高手进啊~!救命啊~!
看你催就仓促写了个,自我感觉写的不是很好,但是能用了。数据只能是大写字母组成的字符串。加密的时候,输入Y,然后输入要加密的文本(大写字母)解密的时候,输入N,然后输入一个整数n表示密文的个数,然后n个整数表示加密时候得到的密文。\/*RSA algorithm *\/ include <stdio.h> include <string.h...

写一个算法,实现顺序表的就地逆置,即在原表的存储空间将线性表(a1...
n->next=m;m=n;n=r;} n->next=m;L->next->next=NULL;L->next=n;b=L->next;printf("\\n\\n逆置之后链表中的元素为:\\n");while(b){ printf("%d, ",b->data);b=b->next;} printf("\\n");return 0;} c编程高手团队正在招新,有意者速速行动,一起学习,一起努力!!!

设计一个算法,实现如下功能:从键盘上输入三角形的三条边长a,b,c,如 ...
include <iostream> include <cmath> using namespace std;int main(){ double a, b, c, s;cin >> a >> b >> c;if ( a + b <= c || a + c <= b || b + c <= a )cout << "不能构成三角形!\\n";else { s = ( a + b + c ) \/ 2;cout << sqrt( s * (...

设计一个求解一元二次方程ax 2 +bx+c=0的算法,并画出程序框图表示._百度...
程序框图如下: 算法分析:我们知道,若判别式Δ=b 2 -4ac>0,则原方程有两个不相等的实数根x 1 = ,x 2 = ;若Δ=0,则原方程有两个相等的实数根x 1 =x 2 = ;若Δ<0,则原方程没有实数根.也就是说,在求解方程之前,可以先判断判别式的符号,根据判断的结果执行不同...

阳山县13617471246: 栈的基本运算程序编写一个程序,实现顺序栈的如下各种基本运算,并在此基础上设计一个主程序验证其正确性:(1)初如化栈S.(2)判断栈S是否非空.... -
慕苑胰酶:[答案] #includetypedef struct node{ int num; struct node *next;}*link,LINK;void empty(link top){ top=NULL;}int pd(link top){ if(top==NULL) { return 0; } else {...

阳山县13617471246: 1、编写一个算法程序实现在一个顺序栈中把一个字符串逆置的运算,要求使用入栈和出栈运算来完成.求牛人给 -
慕苑胰酶: typedef char ElemType;typedef struct {ElemType *stack;ElemType * top;int MaxSize; } Stack;typedef struct {ElemType *queue;int front, rear; } Queue;void HuiWen(char str[ ]){Queue myQueue;Stack myStack;char x, y;int i, length;length =...

阳山县13617471246: 栈的操作编写实现顺序栈的各种基本操作的算法,并在此基础上完成如下功能:(1)初始化栈S;(2)判断栈S是否为空;(3)依次将元素a,b,c,d,e进栈S;(4)判... -
慕苑胰酶:[答案] 头文件: #ifndef _SeStack_struct_h #define _SeStack_struct_h // void visit(SElemType &); Status InitStack(SqStack &S); /* 构造一个空栈S */ Status DestroyStack(SqStack &S); /* 销毁栈S,S不再存在 */ Status ClearStack(SqStack &S); /* 把S置为...

阳山县13617471246: 编写算法,利用栈将字符串逆置. -
慕苑胰酶: 思路就是这样啊 栈的特点就是先进后出 所以完全可以用单向链表来模拟,只要是pop、push函数正确就可以 所以这个问题就可以简化为单向链表反转的问题了 两种方式 非递归 pQueue converse(pQueue t) { tp p1, p2, tmp; int flag = 0; ...

阳山县13617471246: 用c语言编写一个程序实现顺序栈的初始化,出栈和入栈.急需,谢谢 -
慕苑胰酶: #define STACK_SIZE 100 #define PUSH_POP_SUCCESS 1 #define PUSH_POP_ERROR 0struct _stackbuf {int _collection[STACK_SIZE];int _top; }; typedef struct _stackbuf S_STACK; typedef unsigned int u_int_f;// 入栈 u_int_f push(S_...

阳山县13617471246: 用C语言编程实现顺序栈的基本操作. -
慕苑胰酶: # include# include # define M 10 struct student { int number; struct student *next,*prev; }; struct student *p,*pp,*fornt,*po,*q,*top=NULL; struct student *del(struct student *top); struct student *add(struct student *top); void main() { int i=1; while(i<=M) { ...

阳山县13617471246: 编写一个算法利用顺序栈判断一个字符串是否是对称串 -
慕苑胰酶: ElemType ch[]={'a','a','a'}; // 没有加字符串结束标记,导致比较的字符串为随机值 应改为 ElemType ch[]={'a','a','a', '\0'};

阳山县13617471246: 编写算法实现将一个顺序栈中的所有元素一次取出并输入? -
慕苑胰酶: memcpy(目的变量,顺序栈,栈大小);

阳山县13617471246: C++: 编写程序,求一个顺序栈的判空操作,清空操作与求栈长操作,入栈操作和出栈操作, -
慕苑胰酶: template<class Type> Stack<Type>::Stack() {count=0;maxSaveCount=8;data=new Type[maxSaveCount]; //默认初始化分配可以存储8个数据大小的内存空间 }template<class Type> bool Stack<Type>::isEmputy() //判断栈是否为空 {return ...

阳山县13617471246: 用顺序栈实现回文完整的程序编写 -
慕苑胰酶: /*** 判断是否是回文对*/public static boolean judge(final String str){ Stack stack = new Stack();int length =str.length()/2;char[] ch=str.toCharArray();//一半的元素入栈for(int i=0;istack.push(ch[i]); } //根据字符串长度的奇偶决定比较开始的...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网